18.
19. }
20.
21. QSqlTableModel *model = new QSqlTableModel;//间接将数据库表装入QTableView
22. model->setTable("people"); //表名
23. model->setEditStrategy(QSqlTableModel:
:
OnManualSubmit);
24. model->select();
25. //model->removeColumn(0); // don't show the ID
26. //model->setHeaderData(0, Qt:
:
Horizontal, QObject:
:
tr("ID"));
27. model->setHeaderData(0, Qt:
:
Horizontal, tr("Name"));
28. model->setHeaderData(1, Qt:
:
Horizontal, tr("Age"));
29. model->setHeaderData(2, Qt:
:
Horizontal, tr("Sex"));
30.
31.
32. QTableView *view = new QTableView(this);
33. view->setModel(model);
34.
35. db.close();
36.
37. QGridLayout * gl=new QGridLayout();
38. gl->addWidget(view);
39. this->setLayout(gl);
2、
下面是最终的现实效果如下:
现在先做一个显示的界面,界面是由一个表格试图和三个按钮组成。
我的大概流程是:
<1>在对话框窗口先创建一个栅格布局管理器,添加一个表格视图窗口部件。
<2>创建一个水平布局管理器,在水平布局管理器中添加三个按钮,最后将水平布局管理器添加到栅格布局管理器中。
<3>创建三个按钮的信号与槽
<4>数据库的使用分为三步:
(1)QsqlDatabase建立数据库的链接
(2)QsqlQuery用于执行SQL语句(3)QsqlTableModel结合QtableView可以输出数据库的表。
<5>效果测试点击connect按钮链接打开数据库
#include
#include"table.h"
intmain(intargc,char*argv[])
{
QApplicationapp(argc,argv);
Table*table=newTable;
table->show();
returnapp.exec();
}
#ifndefTABLE_H
#defineTABLE_H
#include
#include
classQGridLayout;
classQPushButton;
classQHBoxLayout;
classTable:
publicQDialog
{
Q_OBJECT
public:
//继承公共对话框窗体派生类
Table(QWidget*parent=0);
//创建各个类的指针
QTableView*table;
QGridLayout*gridLayout;
QPushButton*connectButton;
QPushButton*executionButton;
QPushButton*displayButton;
QHBoxLayout*verticalLayout;
privateslots:
//创建三个按钮槽函数
voidon_connectButton_clicked();
voidon_executionButton_clicked();
voidon_displayButton_clicked();
};
#endif
#include
#include
#include
#include
#include"table.h"
Table:
:
Table(QWidget*parent)
:
QDialog(parent)
{
//创建视图及按钮的对象
table=newQTableView;
connectButton=newQPushButton("connect");
executionButton=newQPushButton("execution");
displayButton=newQPushButton("display");
//建立三个信号与槽函数链接
connect(connectButton,SIGNAL(clicked()),this,SLOT(on_connectButton_clicked()));
connect(executionButton,SIGNAL(clicked()),this,SLOT(on_executionButton_clicked()));connect(displayButton,SIGNAL(clicked()),this,SLOT(on_displayButton_clicked()));
//创建一个水平布局管理器,布局三个按钮
verticalLayout=newQHBoxLayout;
verticalLayout->addWidget(connectButton);
verticalLayout->addWidget(executionButton);
verticalLayout->addWidget(displayButton);
//创建一个栅格布局管理器对整体窗口部件的排布。
gridLayout=newQGridLayout;
gridLayout->addWidget(table,0,0,1,1);
gridLayout->addLayout(verticalLayout,1,0,1,1);
setLayout(gridLayout);
//设置窗口的大小
resize(500,400);
}
voidTable:
:
on_connectButton_clicked()
{
//链接函数实现数据库的链接功能
QSqlDatabasedb=QSqlDatabase:
:
addDatabase("QMYSQL");//添加QMYSQL数据库驱动
db.setHostName("localhost");//设置登陆的主机名为localhost
db.setUserName("root");//登陆的用户是超级用户root
db.setPassword("123456");//登陆密码是123456
db.setDatabaseName("student");//打开的数据库表格,这个表格式预先创建好的。
用>createdatabasestudent;创建。
boolok=db.open();
//布尔类型,打开数据。
if(ok)//if判断
{
qDebug()<<"openDatabase!
"<//如果打开数据库在终端输出openDatabase信息
}
else
{QMessageBox:
:
critical(0,QObject:
:
tr("DatabaseError"),db.lastError().text());
//否则输出数据库的消息框错误信息
}
}
voidTable:
:
on_executionButton_clicked()
{
//按executionButton按钮执行SQL语句
QSqlQueryquery;
//创建一个执行数据库SQL语句对象
query.exec("droptableemployee");
//如果存在employee数据库表格,先删除
query.exec("createtableemployee(idint(11)primarykey,namevarchar(50),descriptionvarchar(255))");
//在创建数据库表格employee
query.exec("insertintoemployeevalues(1,'zhangsan','student')");
query.exec("insertintoemployeevalues(2,'lisi','teacher')");
query.exec("insertintoemployeevalues(3,'wangwu','professor')");
//插入三个记录
}
voidTable:
:
on_displayButton_clicked()
{
//用数据库表格模式结合试图显示数据库内容。
QSqlTableModel*model=newQSqlTableModel;
//创建数据表模式对象
model->setTable("employee");
//设置数据库表上的运作模式以employee表名,不选择从数据表格以外获取信息
model->setEditStrategy(QSqlTableModel:
:
OnManualSubmit);
//所有更改将被缓存在模型中,直到submitAll()或revertAll()函数被调用
model->select();
//select()函数用于确定一个或多个套接口的状态。
对每一个套接口,调用者可查询它的可读性、可写性及错误状态信息。
model->setHeaderData(0,Qt:
:
Horizontal,QObject:
:
tr("ID"));model->setHeaderData(1,Qt:
:
Horizontal,QObject:
:
tr("name"));model->setHeaderData(2,Qt:
:
Horizontal,QObject:
:
tr("description"));
//对应指定的字段并设置对应的水平标题显示
table->setModel(model);
//将这个数据库表格模式用视图显示出来。
}
在关闭对话框后出现查询应用默认数据库连接错误:
QSqlDatabasePrivate:
:
removeDatabase:
connection'qt_sql_default_connection'isstillinuse,allquerieswillceasetowork.
我googel以下,参照
的内容测试,还是解决不了。
在第二个按钮末尾添加下面的语句:
QStringname;
{
name=QSqlDatabase:
:
database().connectionName();
}
QSqlDatabase:
:
removeDatabase(name);
On_executionButton_clicked()函数末尾添加,执行SQL语句后关闭窗口时有效的,但在on_displayButton_clicked()函数末尾添加却没有效。
问题还在解决当中。
。
。
。
。
Qt中MySQL数据库操作
首先,要查询相关的驱动是否已经装好了,可以用以下的程序进行验证:
#include
#include
#include
#include
intmain(intargc,char*argv[])
{
QCoreApplicationa(argc,argv);
qDebug()<<"Availabledrivers:
";
QStringListdrivers=QSqlDatabase:
:
drivers();
foreach(QStringdriver,drivers)
qDebug()<<"/t"< returna.exec();
}
结果如下:
接着是连接数据库:
#include
#include
#include
boolcreateConnection()
{
QSqlDatabasedb=QSqlDatabase:
:
addDatabase("QMYSQL");
db.setDatabaseName("test");
db.setUserName("root");
db.setPassword("123456");
boolok=db.open();
if(!
ok){
QMessageBox:
:
critical(0,QObject:
:
tr("连接数据库失败!
!
!
"),db.lastError().text());
returnfalse;
}else{
QMessageBox:
:
information(0,QObject:
:
tr("Tips"),QObject:
:
tr("连接数据库成功!
!
!
"));
returntrue;
}
}
intmain(intargc,char*argv[])
{
QApplicationa(argc,argv);
QTextCodec*codec=QTextCodec:
:
codecForName("GB2312");
QTextCodec:
:
setCodecForLocale(codec);
QTextCodec:
:
setCodecForCStrings(codec);
QTextCodec:
:
setCodecForTr(codec);
if(!
createConnection())
return1;
returna.exec();
}
插入操作:
//ODBC数据库表示方式
QSqlQueryquery;
query.prepare(“insertintostudent(id,name)”
“values(:
id,:
name)”);
query.bindValue(0,5);
query.bindValue(1,“sixth”);
query.exec();
//Oracle表示方式
query.prepare(“insertintostudent(id,name)”
“values(?
?
)”);
query.bindValue(0,5);
query.bindValue(1,“sixth”);
query.exec();
//使用addBindValue()函数,省去了编号,它是按属性顺序赋值的
query.prepare(“insertintostudent(id,name)”
“values(?
?
)”);
query.addBindValue(5);
query.addBindValue(“sixth”);
query.exec();
//使用ODBC方法时,可以将编号用实际的占位符代替
query.prepare(“insertintostudent(id,name)”
“values(:
id,:
name)”);
query.bindValue(“:
id”,5);
query.bindValue(“:
name”,“sixth”);
query.exec();
注意:
最后一定要执行exec(),否则上面的语句是不会被执行的。
//进行多个记录的插入时,可以利用绑定进行批处理
QSqlQueryq;
q.prepare(“insertintostudentvalues(?
?
)”);
QVariantListints;
ints<<10<<11<<12<<13;
q.addBindValue(ints);
QVariantListnames;
names<<“xiaoming”<<“xiaoliang”<<“xiaogang”<:
String);
//最后一个是空字符串,应与前面的格式相同
q.addBindValue(names);
if(!
q.execBatch())//进行批处理,如果出错就输出错误
qDebug()<
查询操作:
//返回全部的属性和结果集
QSqlQueryquery;
query.exec(“select*fromstudent”);//执行查询操作
qDebug()<<“execnext():
”;
if(query.next())
//开始就先执行一次next()函数,那么query指向结果集的第一条记录
{
introwNum=query.at();
//获取query所指向的记录在结果集中的编号
intcolumnNum=query.record().count();
//获取每条记录中属性(即列)的个数
intfieldNo=query.record().indexOf(“name”);
//获取”name”属性所在列的编号,列从左向右编号,最左边的编号为0
intid=query.value(0).toInt();
//获取id属性的值,并转换为int型
QStringname=query.value(fieldNo).toString();
//获取name属性的值
qDebug()<<“rowNumis:
”< <<”idis:
”< <<”nameis:
”< <<”columnNumis:
”<}
qDebug()<<“execseek
(2):
”;
if(query.seek
(2))
//定位到结果集中编号为2的记录,即第三条记录,因为第一条记录的编号为0
{
qDebug()<<“rowNumis:
”< <<”idis:
”< <<”nameis:
”<(1).toString();
}
qDebug()<<“execlast():
”;
if(query.last())
//定位到结果集中最后一条记录
{
qDebug()<<“rowNumis:
”< <<”idis:
”< <<”nameis:
”<(1).toString();
}
结果集其实就是查询到的所有记录的集合,而在QSqlQuery类中提供了多个函数来操作这个集合,需要注意这个集合中的记录是从0开始编号的。
最常用的有:
seek(intn):
query指向结果集的第n条记录。
first():
query指向结果集的第一条记录。
last():
query指向结果集的最后一条记录。
next():
query指向下一条记录,每执行一次该函数,便指向相邻的下一条记录。
previous():
query指向上一条记录,每执行一次该函数,便指向相邻的上一条记录。
record():
获得现