现在先做一个显示的界面,界面是由一个表格试图和三个按钮组成。我的大概流程是:
<1>
在对话框窗口先创建一个栅格布局管理器,添加一个表格视图窗口部件。
<2>
创建一个水平布局管理器,在水平布局管理器中添加三个按钮,最后将水平布局管理器添加到栅格布局管理器中。
<3>
创建三个按钮的信号与槽
<4>
数据库的使用分为三步:(1)QsqlDatabase建立数据库的链接(2)QsqlQuery用于执行SQL语句(3)QsqlTableModel结合QtableView可以输出数据库的表。
<5>
效果测试点击connect按钮链接打开数据库
参考:http://blog.csdn.net/MicroSky2813/archive/2010/03/02/5338040.aspx
#include <QApplication>
#include "table.h"
int main(int argc,char *argv[])
{
QApplication app(argc,argv);
Table *table = new Table;
table->show();
return app.exec();
}
#ifndef TABLE_H
#define TABLE_H
#include <QDialog>
#include <QTableView>
class QGridLayout;
class QPushButton;
class QHBoxLayout;
class Table:public QDialog
{
Q_OBJECT
public:
//
继承公共对话框窗体派生类
Table(QWidget *parent = 0);
//
创建各个类的指针
QTableView *table;
QGridLayout *gridLayout;
QPushButton *connectButton;
QPushButton *executionButton;
QPushButton *displayButton;
QHBoxLayout *verticalLayout;
private slots:
//
创建三个按钮槽函数
void on_connectButton_clicked();
void on_executionButton_clicked();
void on_displayButton_clicked();
};
#endif
#include <QtGui>
#include <QSqlTableModel>
#include <QtSql>
#include <QDebug>
#include "table.h"
Table::Table(QWidget *parent)
:QDialog(parent)
{
//
创建视图及按钮的对象
table = new QTableView;
connectButton = new QPushButton("connect");
executionButton = new QPushButton("execution");
displayButton = new QPushButton("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 = new QHBoxLayout;
verticalLayout->addWidget(connectButton);
verticalLayout->addWidget(executionButton);
verticalLayout->addWidget(displayButton);
//
创建一个栅格布局管理器对整体窗口部件的排布。
gridLayout = new QGridLayout;
gridLayout->addWidget(table,0,0,1,1);
gridLayout->addLayout(verticalLayout,1,0,1,1);
setLayout(gridLayout);
//
设置窗口的大小
resize(500,400);
}
void Table::on_connectButton_clicked()
{
//
链接函数实现数据库的链接功能
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL"); //
添加QMYSQL数据库驱动
db.setHostName("localhost"); //
设置登陆的主机名为localhost
db.setUserName("root"); //
登陆的用户是超级用户 root
db.setPassword("123456"); //
登陆密码是123456
db.setDatabaseName("student"); //
打开的数据库表格,这个表格式预先创建好的。用>create database student;创建。
bool ok = db.open();
//
布尔类型,打开数据。
if(ok) //if
判断
{
qDebug()<<"open Database!"<<endl;
//
如果打开数据库在终端输出open Database信息
}
else
{
QMessageBox::critical(0,QObject::tr("Database Error"),db.lastError().text());
//
否则输出数据库的消息框错误信息
}
}
void Table::on_executionButton_clicked()
{
//
按executionButton按钮执行SQL语句
QSqlQuery query;
//
创建一个执行数据库SQL语句对象
query.exec("drop table employee");
//
如果存在employee数据库表格,先删除
query.exec("create table employee(id int(11) primary key,name varchar(50),description varchar(255))");
//
在创建数据库表格employee
query.exec("insert into employee values(1,'zhangsan','student')");
query.exec("insert into employee values(2,'lisi','teacher')");
query.exec("insert into employee values(3,'wangwu','professor')");
//
插入三个记录
}
void Table::on_displayButton_clicked()
{
//
用数据库表格模式结合试图显示数据库内容。
QSqlTableModel *model = new QSqlTableModel;
//
创建数据表模式对象
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' is still in use, all queries will cease to work.
我googel以下,参照http://www.cnblogs.com/codingmylife/archive/2010/04/27/1722404.html
的内容测试,还是解决不了。
在第二个按钮末尾添加下面的语句:
QString name;
{
name = QSqlDatabase::database().connectionName();
}
QSqlDatabase::removeDatabase(name);
On_executionButton_clicked()
函数末尾添加,执行SQL语句后关闭窗口时有效的,但在on_displayButton_clicked()函数末尾添加却没有效。问题还在解决当中。。。。。