为了完成linux应用程序设计的作业,我选择了用QT+MYSQL开发一个学生管理系统
开发过程入门和注意事项如下:
只学习了一天,有不妥之处不要见怪。(word的格式直接发布到博客上真麻烦,搞了半天)
一、开发环境的搭建
打开终端输入以下命令:(不包含井号)
#sudo apt-get install qt4-dev-tools qt4-doc qt4-qtconfig qt4-demos qt4-designer
#sudo apt-get install qtcreator
以上两条命令安装了QT CREATOR和一些必备的,下面安装MYSQL
#sudo apt-get install libqt4-sql-mysql
#sudo apt-get install mysql-server mysql-client
#sudo apt-get install libqt4-sql-mysql
#sudo apt-get install libmysqlclient15-dev
#sudo /etc/init.d/mysql restart
SQL安装好后,给普通用户授权操作数据库和登录数据库在终端输入:
#mysql -u root -p
以上一条命令是以root登录数据库
数据库的操作方式在后面介绍。
(给特定用户分配数据操作权限的格式是:
grant 权限1,权限2,...权限n on 数据库名称.表名称 to 用户名@用户ip地址 identified by '密码';)
二、开始程序设计
1.在Ubuntu系统中,点击【Application】>>【Program】>>【QT Creator】,打开QT Creator
点击New File or Project,如下图所示,选择Qt C++ Project>>Qt Gui Application,单击Choose
3.现在可以看到代码界面了,如下图,
QT += sql
如下图
去main.cpp里面写代码,如下:(注意登录数据库的用户名和密码应该是你的)
#include <QtGui/QApplication>
#include "mainwindow.h"
#include <QtSql/QSqlDatabase>
#include <QSqlQuery>
#include <QtGui/QTableView>
#include <QSqlQueryModel>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
QSqlDatabase db;
w.show();
db = QSqlDatabase::addDatabase("QMYSQL");
db.setHostName("localhost");
db.setDatabaseName("stu");
db.setUserName("root");
db.setPassword("123456");
db.open();
return a.exec();
}
可以用QT designer画出图形界面,使用布局管理器。然后保存为.ui文件,写好main.cpp,用终端【qmake -project】【qmake xxx.pro】【make】,生成的.h文件就是等价与画的.ui文件。也可以直接用QT Creator画。
http://forum.ubuntu.org.cn/viewtopic.php?p=2196084
远程等,授权等:http://www.cppblog.com/zzg/archive/2009/05/29/86066.html
远程等,删除授权等http://www.cnblogs.com/frostbelt/archive/2011/02/22/1961186.html
mysql常用命令:注意(这些命令在终端登录SQL时后面的【;】分号不能省,在程序里面操作时不要分号。)
mysql -u 用户名 –p
1.增加用户
grant 权限1,权限2,...权限n on 数据库名称.表名称 to 用户名@用户ip地址 identified by '密码';
2.显示数据库列表
show databases;
3.使用数据库
use 数据库名;
4.创建数据库
create database 数据库名;
5.备份数据库
mysqldump -h host -u root -p 数据库名 >备份.sql
6.恢复数据库
mysqladmin -h myhost -u root -p create dbname
mysqldump -h host -u root -p 数据库名 < 备份.sql
7.删除数据库
drop database 数据库名;
8.显示数据库中的表格
use 数据库名;
show tables;
9.创建表格
use 数据库名;
create table 表格名(<字段名1> <类型1> <字段名n> <类型n>);
10.显示表格的结构:
describe 表格名;
11.向表格中添加记录
insert into 表格名(字段1 , 字段2 , ….) values(值1 , 值2 , …..);
例:insert into 表格名(name, age) values('xiaoxi', 18)
12.更新表格中到记录
update 表格名 set <字段名称>=<值> where <条件>
例:把ID 为2的记录用户名(username)的值更改为china.
update user set username='china' where id=2;
13.清空表格中的记录
delete from 表格名 条件
例:将学生表格中ID为2的记录删除掉
delete from student where id=2;
14.重命名表格
alter table 表格1 rename 表格2;
15.删除表格
drop table 表格名;
16.显示表中的记录:
select * from 表格名;
通过query.exec(cmd);操作数据库。
cmd的拼接方式如下:
Qstring cmd = tr("select *from student where ")+ tr("Sno=") +tr("\'")+ui->seeknumlineEdit->text()+tr("\' ")+tr("and ")+tr("Sname=") +tr("\'")+ui->seeknamelineEdit->text()+tr("\'");
程序中执行query.exec(cmd);等价于在终端登录SQL后执行select *from student where Sno = '123' and Sname='123';
四、最后现在可以开始程序设计了,剩下的问题就是QT CREATOR的使用方法和编程的方法了,希望多查资料摸索。这里简单的为设计QT+SQL的开发做最基本的准备和QT CREATOR最基本的使用方法。
你可以将下面的代码复制,替换第二步建好的工程里面的main.cpp,运行。
注意登录数据库时的账户和密码以及数据库名称(代码红色部分)
以下代码来自互联网,我自己改动了一些以便能在我的机器上运行成功。感谢这些代码的原作者。http://forum.ubuntu.org.cn/viewtopic.php?p=2196084
#include <QtGui/QApplication>
#include <QMessageBox>
#include <QStringList>
#include <QDebug>
#include <QtSql/QSqlDatabase>
#include <QSqlQuery>
#include <QtGui/QTableView>
#include <QSqlQueryModel>
int main(int argc, char* argv[])
{
/*QApplication app(argc, argv);
qDebug() << "Available drivers:";
QStringList drivers = QSqlDatabase::drivers();
foreach(QString driver, drivers)
qDebug() << "\t" << driver;
QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");
qDebug() << "ODBC driver valid?" << db.isValid();
return app.exec();*/
/*QCoreApplication a(argc, argv);
QSqlDatabase db=QSqlDatabase::addDatabase("QMYSQL");
db.setHostName("localhost");
db.setDatabaseName("test");
db.setUserName("root");
db.setPassword("123456");
if(!db.open()){
qDebug()<<"Unable to open database";
}else{
qDebug()<<"Database connection established";
return a.exec();
}*/
QApplication app(argc, argv);
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
db.setHostName("localhost");
db.setDatabaseName("stu");
db.setUserName("root");
db.setPassword("123456");
db.open();
QSqlQuery query;
//Create table
query.exec("create table student(Sname CHAR(20), Sno CHAR(10),Ssex CHAR(6),Sage SMALLINT,primary key (Sno))");
//insert information
query.exec("insert into student(Sno, Sname, Ssex, Sage) values('2008441105','xcy', 'female',18)");
//query.exec("drop table student");
if(!query.exec("insert into student(Sno, Sname, Ssex, Sage) values('2008441105','xcy', 'female',18)"))
QMessageBox::warning(NULL, "waring", "Already Have!", QMessageBox::Yes);
//ODBC风格
/* query.prepare("insert into hello(name, age)" "values(?, ?)");
query.addBindValue("xiaoxi");
query.addBindValue(18);
query.exec();
query.addBindValue("xiaonan");
query.addBindValue(19);
query.exec();
query.addBindValue("xiaobei");
query.addBindValue(20);
query.exec();
query.addBindValue("xiaodong");
query.addBindValue(21);
query.exec();*/
//Oracle风格
/*query.prepare("insert into hello(name, age) values(:name, :age)");
query.bindValue(":name", "xiaoxi");
query.bindValue(":age", 18);
query.exec();
query.bindValue(":name", "xiaonan");
query.bindValue(":age", 19);
query.exec();
query.bindValue(":name", "xiaobei");
query.bindValue(":age", 20);
query.exec();
query.bindValue(":name", "xiaodong");
query.bindValue(":age", 21);
query.exec();*/
QSqlQueryModel *model = new QSqlQueryModel;
model->setQuery("select * from student");
model->setHeaderData(0, Qt::Horizontal, "name");
model->setHeaderData(1, Qt::Horizontal, "no");
model->setHeaderData(2, Qt::Horizontal, "sex");
model->setHeaderData(3, Qt::Horizontal, "age");
QTableView *view = new QTableView;
view->setWindowTitle("QSqlQueryModel");
view->setModel(model);
view->show();
/*QSqlTableModel *model = new QSqlTableModel;
model->setTable("hello");
model->select();
for (int i = 0; i < model->rowCount(); ++i)
{
QSqlRecord record = model->record(i);
int id = record.value(0).toInt();
QString name = record.value(1).toString();
int age = record.value(2).toInt();
cout << id << " " << qPrintable(name) << " " << age << endl;
}*/
db.close();
return app.exec();
}