(2010-06-09 22:50:42)
转载
标签:
| 杂谈 | 分类:QT |
// 设置一下数据库的表名, 然后直接select()就搞定了. 非常简单.
void initializeModel(QSqlTableModel *model) {
model->setTable("person");
model->setEditStrategy(QSqlTableModel::OnRowChange);
model->select();
model->setHeaderData(0, Qt::Horizontal, QObject::tr("ID"));
model->setHeaderData(1, Qt::Horizontal, QObject::tr("First name"));
model->setHeaderData(2, Qt::Horizontal, QObject::tr("Last name"));
}
// 使用model view
QTableView *createView(const QString &title, QSqlTableModel *model) {
QTableView *view = new QTableView;
view->setModel(model);
view->setWindowTitle(title);
return view;
}
QSqlTableModel model(&app, getDatabase());
initializeModel(&model);
QTableView *view1 = createView(QObject::tr("Table Model (View 1)"), &model);
view1->show();
sqlite简介
sqlite 是一款轻量级的、基于文件的嵌入式数据库,2000年就已经诞生,经过7年多的发展,直到今天已经成为最流行的嵌入式数据库,包括google在内的公司在其桌面软件中亦使用 sqlite 存储用户数据。由此可以看出,已经没有任何理由去怀疑sqlite的稳定性了。
sqlite 的优势
1. 免配置,和access一样,只要把数据库文件通过ftp上传到服务器上就可以使用,不需要服务器的额外支持
2. 备份方便,因为只是一个文件,只要复制一份该文件,就能备份整个数据库
3. 虽然是轻量级数据库,但他支持最大 2tb 的单个库文件。
4. 快,无与伦比的快。经过实际测试,在几百万记录的情况下,sqlite的插入和查询速度和 mysql 不分上下,快于 sql server,10倍于 access (但这并不意味着它可以替代 sql server )
用QT操作 sqlite
由于sqlite属于轻量级的数据库,不需要配置,不需要安装,也不需要管理员,所以也就没必要像操作mysql等数据库一样的设置主机,用户和密码了。样例如下:
#include #include #include #include #include #include #include #include #include int main(int argc, char *argv[]) { QApplication app(argc, argv); QTextEdit display; display.resize(400, 160); display.show(); //下面进行数据库的设置 QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); //使用sqlite数据库驱动 db.setDatabaseName("test"); //我们之前建立的数据库 bool ok = db.open(); //尝试连接数据库 if (ok) { //这里用text已经成功连上数据库 QSqlQuery query; //新建一个查询的实例 if (query.exec("select * from student")) //尝试列出 student 表的所有记录 { //本次查询成功 int numRows = 0; //询问数据库驱动,是否驱动含有某种特性 if (db.driver()->hasFeature(QSqlDriver::QuerySize)) { numRows = query.size(); //如果支持结果影响的行数,那么直接记录下来 } else { query.last(); //否则定位到结果最后,qt 文档说,这个方法非常慢 numRows = query.at() + 1; query.seek(-1); } QString name, age; display.append("==========================================="); while(query.next()) { //定位结果到下一条记录 name = query.value(0).toString(); age = query.value(1).toString(); QString result = name + " " + age; display.append(result); } display.append("==========================================="); display.append(QString("totally %1 rows").arg(numRows) ); } else { //如果查询失败,用下面的方法得到具体数据库返回的原因 QSqlError error = query.lastError(); display.append("From mysql database: " + error.databaseText()); } } else { //打开数据库失败,显示数据库返回的失败描述 display.append("cannot open database."); display.append("Reason: " + db.lastError().databaseText()); } QApplication::connect(&app, SIGNAL(lastWindowClose()), &app, SLOT(quit())); return app.exec(); } QT 学习:根据数据库的内容动态添加Button 如果需要对数据库操作,必须在.pro文件中加入: QT +=sql 代 码如下: #include #include #include #include #include #include #include #include #include #include #include "mainwindow.h" #include "ui_mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); //下面进行数据库的设置 int i; QVBoxLayout *layInstruct = new QVBoxLayout;//ToolBox的Layout QToolBox *tbInstruct=new QToolBox(); QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); //使用sqlite数据库驱动 db.setDatabaseName("G:\\\\SerialInstruct.db3"); //我们之前建立的数据库 if (db.open())//尝试连接数据库 { //已经成功连上数据库 QSqlQuery query; //新建一个查询的实例 if (query.exec("select * from UnitData")) //尝试列出 student 表的所有记录 { //本次查询成功 int numRows = 0; //询问数据库驱动,是否驱动含有某种特性 if (db.driver()->hasFeature(QSqlDriver::QuerySize)) { numRows = query.size(); //如果支持结果影响的行数,那么直接记录下来 } else { query.last(); //否则定位到结果最后,qt 文档说,这个方法非常慢 numRows = query.at() + 1; query.seek(-1); } QString name, age; i=0; while(query.next()) { //定位结果到下一条记录 name = query.value(0).toString(); age = query.value(1).toString(); QString result = name + " " + age; QWidget *pages=new QWidget(); tbInstruct->addItem(pages,age); QSqlQuery qryInstruct;//查询子表内容,用于创建Button if (qryInstruct.exec(QString("Select ID,Description from InstructList Where UnitID=%1").arg(i+1))) { tbInstruct->setCurrentIndex(i); QVBoxLayout *layout = new QVBoxLayout;//建立一个坚排的规则 while(qryInstruct.next()) { QString sID,sCaption; sID=qryInstruct.value(0).toString(); sCaption=qryInstruct.value(1).toString(); QPushButton *button = new QPushButton(sCaption); button->setAccessibleDescription(sID); button->setCheckable(true); button->setAutoExclusive(true); layout->addWidget(button);//把Button放入Layout中 } layout->setSpacing(0); pages->setLayout(layout); } i=i+1; } //ui->toolBox->removeItem(0); tbInstruct->setCurrentIndex(0); layInstruct->addWidget(tbInstruct); layInstruct->setSpacing(0); ui->centralWidget->setLayout(layInstruct); } else { //如果查询失败,用下面的方法得到具体数据库返回的原因 QSqlError error = query.lastError(); //display.append("From mysql database: " + error.databaseText()); } } else { //打开数据库失败,显示数据库返回的失败描述 //display.append("cannot open database."); //display.append("Reason: " + db.lastError().databaseText()); } } MainWindow::~MainWindow() { delete ui; } void MainWindow::changeEvent(QEvent *e) { QMainWindow::changeEvent(e); switch (e->type()) { case QEvent::LanguageChange: ui->retranslateUi(this); break; default: break; } }下载本文