qt4 数据库操作---------tableView

[cpp]  view plain copy
  1. //connection.h  
  2. #ifndef CONNECTION_H  
  3. #define CONNECTION_H  
  4. #include <QMessageBox>  
  5. #include <QSqlDatabase>  
  6. #include <QSqlQuery>  
  7.   
  8. static bool createConnection()  
  9. {  
  10.     QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");  
  11.    // db.setDatabaseName(":memory:");  
  12.     db.setDatabaseName("/test1.db");  
  13.     if (!db.open()) {  
  14.         QMessageBox::critical(0, qApp->tr("Cannot open database"),  
  15.             qApp->tr("Unable to establish a database connection."  
  16.                      ), QMessageBox::Cancel);  
  17.         return false;  
  18.     }  
  19.   
  20.      QSqlQuery query;  
  21.      query.exec("create table student (id int primary key, name varchar(20))");  
  22.      //创建表student,如果student表已经存在则无动作  
  23.      query.exec("insert into student values(0, 'first')");  
  24.      query.exec("insert into student values(1, 'second')");  
  25.      query.exec("insert into student values(2, 'third')");  
  26.      query.exec("insert into student values(3, 'fourth')");  
  27.      query.exec("insert into student values(4, 'fifth')");  
  28.     return true;  
  29. }  
  30. #endif // CONNECTION_H  

[cpp]  view plain copy
  1. //main.cpp  
  2. #include <QtGui/QApplication>  
  3. #include "mainwindow.h"  
  4. #include"connection.h"  
  5. #include<QDebug>  
  6.   
  7. int main(int argc, char *argv[])  
  8. {  
  9.     QApplication a(argc, argv);  
  10.     if (!createConnection())  
  11.         return 1;  
  12.   
  13.     MainWindow w;  
  14.     w.show();  
  15.   
  16.     return a.exec();  
  17. }  

[cpp]  view plain copy
  1. //mainwindow.cpp  
  2. void MainWindow::on_pushButton_clicked()  
  3. {  
  4.     QSqlQuery query;  
  5.     query.exec("select * from student");  
  6.     QString str;  
  7.     while(query.next())  
  8.     {  
  9.         qDebug() << query.value(0).toInt() << query.value(1).toString();  
  10.         str=str+"\n"+query.value(1).toString();  
  11.         ui->textEdit->setText(str);  
  12.     }  
  13.   
  14. }  


[cpp]  view plain copy
  1. void MainWindow::on_pushButton_2_clicked()  
  2. {  
  3.     QSqlQuery query;  
  4.      query.exec("select * from student");  
  5.      qDebug() << "exec next() :";  
  6.      if(query.next())  
  7.      //开始就先执行一次next()函数,那么query指向结果集的第一条记录  
  8.      {  
  9.          int rowNum = query.at();  
  10.          //获取query所指向的记录在结果集中的编号  
  11.          int columnNum = query.record().count();  
  12.          //获取每条记录中属性(即列)的个数  
  13.          int fieldNo = query.record().indexOf("name");  
  14.          //获取"name"属性所在列的编号,列从左向右编号,最左边的编号为0  
  15.          int id = query.value(0).toInt();  
  16.          //获取id属性的值,并转换为int型  
  17.         QString name = query.value(fieldNo).toString();  
  18.          //获取name属性的值  
  19.          qDebug() << "rowNum is : " << rowNum //将结果输出  
  20.                  << " id is : " << id  
  21.                  << " name is : " << name  
  22.                  << " columnNum is : " << columnNum;  
  23.      }  
  24.      qDebug() << "exec seek(2) :";  
  25.      if(query.seek(2))  
  26.      //定位到结果集中编号为2的记录,即第三条记录,因为第一条记录的编号为0  
  27.      {  
  28.          qDebug() << "rowNum is : " << query.at()  
  29.                  << " id is : " << query.value(0).toInt()  
  30.                  << " name is : " << query.value(1).toString();  
  31.      }  
  32.      qDebug() << "exec last() :";  
  33.      if(query.last())  
  34.      //定位到结果集中最后一条记录  
  35.      {  
  36.          qDebug() << "rowNum is : " << query.at()  
  37.                  << " id is : " << query.value(0).toInt()  
  38.                  << " name is : " << query.value(1).toString();  
  39.      }  
  40. }  

当数据库已open,可进行如下操作
创建表
[cpp]  view plain copy
  1. query.exec("create table student (id int primary key, name varchar(20))");  
  2. //创建表student,如果student表已经存在则无动作  
  3. //有两个字段,id(兼任主键)和name  

添加记录
[cpp]  view plain copy
  1. //直接添加  
  2. query.exec("insert into student values(1, 'second')");  
  3. //在表中增加一条主键即id是1的记录,name字段是"second"  
  4. //如果id=1的记录已经存在,则无动作  
  5.   
  6. //使用变量添加  
  7. query.prepare("insert into student values (?, ?)");  
  8. query.bindValue(0, i);  
  9. query.bindValue(1, "sixth");  
  10. query.exec();  
  11.   
  12.   
  13. //或  
  14. query.prepare("insert into student (id, name) values (:id, :name)");  
  15. query.bindValue(0, i);  
  16. query.bindValue(1, "sixth");  
  17. query.exec();  
  18.   
  19.   
  20. //或  
  21.     query.prepare("insert into student (id, name) values (:id, :name)");  
  22.     query.addBindValue(i);  
  23.     query.addBindValue("sixth");  
  24.     query.exec();  

删除记录
[cpp]  view plain copy
  1. query.exec("delete from student where id = 1");  


查询记录
[cpp]  view plain copy
  1. //直接查询  
  2. query.exec("select name from student where id = 1");  
  3. query.exec("select name from student ");  
  4. query.exec("select * from student ");  
  5.   
  6.   
  7. //使用变量    
  8. query.prepare("select name from student where id = ?");            
  9. int id = ui->spinBox->value(); //从界面获取id的值            
  10. query.addBindValue(id); //将id值进行绑定          
  11. query.exec();  

更新记录
[cpp]  view plain copy
  1. //使用变量      
  2.     QSqlQuery query;  
  3.     query.prepare("update student set name = ? where id = ?");  
  4.     query.addBindValue(name);  
  5.     query.addBindValue(studentId);  
  6.     query.exec();  

http://www.yafeilinux.com/?p=82



************************************************************************************************************************************************************************************

二十五、Qt数据库(五)QSqlQueryModel

二十六、Qt数据库(六)QSqlTableModel

二十七、Qt数据库(七)QSqlRelationalTableModel


[cpp]  view plain copy
  1. //mainwindow.cpp  
  2. #include "mainwindow.h"  
  3. #include "ui_mainwindow.h"  
  4. #include<QtGui>  
  5. #include <QSqlQuery>  
  6. #include <QtDebug>  
  7. #include<QSqlRecord>  
  8. #include <QModelIndex>  
  9. #include<QSqlQueryModel>  
  10. #include "mysqlquerymodel.h"  
  11. #include <QTableView>  
  12. #include <QSqlRelationalDelegate>  
  13. #include<QSqlError>  
  14. MainWindow::MainWindow(QWidget *parent) :  
  15.     QMainWindow(parent),  
  16.     ui(new Ui::MainWindow)  
  17. {  
  18.     ui->setupUi(this);  
  19. /* 
  20.     model = new QSqlTableModel(this); 
  21.     model->setTable("student"); 
  22.     model->setEditStrategy(QSqlTableModel::OnManualSubmit); 
  23.     model->select(); //选取整个表的所有行 
  24.    // model->removeColumn(0); //不显示name属性列,如果这时添加记录,则该属性的值添加不上 
  25.     ui->tableView->setModel(model); 
  26.     //ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);   //使其不可编 
  27.     */  
  28.   
  29.     model = new QSqlRelationalTableModel(this);  
  30.       model->setEditStrategy(QSqlTableModel::OnFieldChange); //属性变化时写入数据库  
  31.       model->setTable("student");  
  32.       model->setRelation(2,QSqlRelation("course","id","name"));  
  33.       //将student表的第三个属性设为course表的id属性的外键,并将其显示为course表的name属性的值  
  34.       model->setHeaderData(0, Qt::Horizontal, QObject::tr("ID"));  
  35.       model->setHeaderData(1, Qt::Horizontal, QObject::tr("Name"));  
  36.       model->setHeaderData(2, Qt::Horizontal, QObject::tr("Course"));  
  37.       model->select();  
  38.       ui->tableView->setModel(model);  
  39.       ui->tableView->setItemDelegate(new QSqlRelationalDelegate(ui->tableView));  
  40.   
  41. }  
  42.   
  43. MainWindow::~MainWindow()  
  44. {  
  45.     delete ui;  
  46. }  
  47.   
  48. void MainWindow::on_pushButton_clicked()  
  49. {  
  50.     QSqlQuery query;  
  51.     query.exec("select * from student");  
  52.     QString str;  
  53.     while(query.next())  
  54.     {  
  55.         qDebug() << query.value(0).toInt() << query.value(1).toString();  
  56.         str=str+"\n"+query.value(1).toString();  
  57.        // ui->lineEdit->setText(str);  
  58.         //ui->textEdit->setText(str);  
  59.     }  
  60.   
  61. }  
  62.   
  63. void MainWindow::on_pushButton_2_clicked()  
  64. {  
  65.     QSqlQuery query;  
  66.      query.exec("select * from student");  
  67.      qDebug() << "exec next() :";  
  68.      if(query.next())  
  69.      //开始就先执行一次next()函数,那么query指向结果集的第一条记录  
  70.      {  
  71.          int rowNum = query.at();  
  72.          //获取query所指向的记录在结果集中的编号  
  73.          int columnNum = query.record().count();  
  74.          //获取每条记录中属性(即列)的个数  
  75.          int fieldNo = query.record().indexOf("name");  
  76.          //获取"name"属性所在列的编号,列从左向右编号,最左边的编号为0  
  77.          int id = query.value(0).toInt();  
  78.          //获取id属性的值,并转换为int型  
  79.         QString name = query.value(fieldNo).toString();  
  80.          //获取name属性的值  
  81.          qDebug() << "rowNum is : " << rowNum //将结果输出  
  82.                  << " id is : " << id  
  83.                  << " name is : " << name  
  84.                  << " columnNum is : " << columnNum;  
  85.      }  
  86.      qDebug() << "exec seek(2) :";  
  87.      if(query.seek(2))  
  88.      //定位到结果集中编号为2的记录,即第三条记录,因为第一条记录的编号为0  
  89.      {  
  90.          qDebug() << "rowNum is : " << query.at()  
  91.                  << " id is : " << query.value(0).toInt()  
  92.                  << " name is : " << query.value(1).toString();  
  93.      }  
  94.      qDebug() << "exec last() :";  
  95.      if(query.last())  
  96.      //定位到结果集中最后一条记录  
  97.      {  
  98.          qDebug() << "rowNum is : " << query.at()  
  99.                  << " id is : " << query.value(0).toInt()  
  100.                  << " name is : " << query.value(1).toString();  
  101.      }  
  102. }  
  103.   
  104. void MainWindow::on_pushButton_3_clicked()  
  105. {  
  106.     QSqlQuery query;  
  107.   
  108.     int i=210;  
  109.     while(i--){  
  110.         query.prepare("insert into student values (?, ?)");  
  111.         query.bindValue(0, i);  
  112.         query.bindValue(1, "sixth");  
  113.         query.exec();  
  114.   
  115.     }  
  116.   
  117.   
  118.     //下面输出最后一条记录  
  119.     query.exec("select * from student");  
  120.     query.last();  
  121.     int id = query.value(0).toInt();  
  122.     QString name = query.value(1).toString();  
  123.     qDebug() << id << name;  
  124. }  
  125.   
  126. void MainWindow::on_pushButton_4_clicked()  
  127. {         //  QSqlQuery query;  
  128.         // query.exec("insert into student values(69, '768')");  
  129.             QSqlQuery query;  
  130.             query.prepare("select name from student where id = ?");  
  131.             int id = ui->spinBox->value(); //从界面获取id的值  
  132.             query.addBindValue(id); //将id值进行绑定  
  133.             query.exec();  
  134.             query.next(); //指向第一条记录  
  135.             qDebug() << query.value(0).toString();  
  136.   
  137.   
  138. }  
  139.   
  140. void MainWindow::on_pushButton_5_clicked()  
  141. {  
  142.     QSqlQueryModel *model = new QSqlQueryModel;  
  143.      model->setQuery("select * from student");  
  144.      model->setHeaderData(0, Qt::Horizontal, tr("id"));  
  145.      model->setHeaderData(1, Qt::Horizontal, tr("name song"));  
  146.      QTableView *view = new QTableView;  
  147.      view->setWindowTitle("ggg"); //修改窗口标题  
  148.   
  149.      view->setModel(model);  
  150.      view->show();  
  151.   
  152.   
  153.      MySqlQueryModel *myModel = new MySqlQueryModel; //创建自己模型的对象  
  154.      myModel->setQuery("select * from student");  
  155.      myModel->setHeaderData(0, Qt::Horizontal, tr("id"));  
  156.      myModel->setHeaderData(1, Qt::Horizontal, tr("name"));  
  157.      QTableView *view1 = new QTableView;  
  158.      view1->setWindowTitle("mySqlQueryModel"); //修改窗口标题  
  159.      view1->setModel(myModel);  
  160.      view1->show();  
  161.   
  162.      int column = model->columnCount(); //获得列数  
  163.      int row = model->rowCount();    // 获得行数  
  164.      QSqlRecord record = model->record(1); //获得一条记录  
  165.      QModelIndex index = model->index(1,1);   //获得一条记录的一个属性的值  
  166.      qDebug() << "column num is:" << column << endl  
  167.                  << "row num is:" << row << endl  
  168.                  <<"the second record is:" << record << endl  
  169.                  << "the data of index(1,1) is:"<< index.data();  
  170.   
  171.   
  172. }  
  173.   
  174. void MainWindow::on_pushButton_6_clicked()  
  175. {  
  176.   
  177.   
  178.   
  179. }  
  180.   
  181. void MainWindow::on_pushButton_7_clicked()  
  182. {  
  183.     model->database().transaction(); //开始事务操作  
  184.     if (model->submitAll()) {  
  185.         model->database().commit(); //提交  
  186.     } else {  
  187.         model->database().rollback(); //回滚  
  188.         QMessageBox::warning(this, tr("tableModel"),  
  189.                                  tr("数据库错误: %1")  
  190.                              .arg(model->lastError().text()));  
  191.     }  
  192. }  
  193.   
  194. void MainWindow::on_pushButton_8_clicked()  
  195. {  
  196.      model->revertAll();  
  197. }  
  198.   
  199. void MainWindow::on_pushButton_9_clicked()  
  200. {  
  201.     QString str=ui->lineEdit->text();  
  202.   
  203.     model->setFilter(tr("name='%1'").arg(str));  
  204.     model->select();  
  205. }  
  206.   
  207. void MainWindow::on_pushButton_10_clicked()  
  208. {   model->setTable("student");  
  209.     model->select();  
  210. }  
  211.   
  212. void MainWindow::on_pushButton_11_clicked()  
  213. {  
  214.     model->setSort(0,Qt::AscendingOrder); //id属性,即第0列,升序排列  
  215.     model->select();  
  216. }  
  217.   
  218. void MainWindow::on_pushButton_12_clicked()  
  219. {  
  220.     model->setSort(0,Qt::DescendingOrder); //id属性,即第0列,升序排列  
  221.     model->select();  
  222. }  
  223.   
  224. void MainWindow::on_pushButton_14_clicked()  
  225. {  
  226.     int curRow = ui->tableView->currentIndex().row();  
  227.     //获取选中的行  
  228.     model->removeRow(curRow);  
  229.     //删除该行  
  230.     int ok = QMessageBox::warning(this,tr("删除当前行!"),tr("你确定"  
  231.                                                            "删除当前行吗?"),  
  232.                          QMessageBox::Yes,QMessageBox::No);  
  233.     if(ok == QMessageBox::No)  
  234.     {  
  235.        model->revertAll(); //如果不删除,则撤销  
  236.     }  
  237.     else model->submitAll(); //否则提交,在数据库中删除该行  
  238. }  
  239.   
  240. void MainWindow::on_pushButton_13_clicked()  
  241. {  
  242.     int rowNum = model->rowCount(); //获得表的行数  
  243.     //int id = 10;  
  244.     model->insertRow(rowNum); //添加一行  
  245.     model->setData(model->index(rowNum,0),rowNum+1);  
  246.     model->setData(model->index(rowNum,1),"rowNum");  
  247.     //model->submitAll(); //可以直接提交  
  248. }  

最后的
model->setData(model->index(rowNum,0),rowNum+1);
此函数是给某条记录的某个字段赋值
参数1  model->index(rowNum,0)指定视图表格中的第rowNum行,从1开始,不是数据库的表第rowNum行,的字段0。
参数2  是实际要赋的值,上面的那个字段值指定为rowNum+1
比如,点击2次添加记录按钮

另外在add记录时,注意构造函数中手动提交和字段变化时自动提交的区别
model -> setEditStrategy ( QSqlTableModel :: OnManualSubmit );
model->setEditStrategy(QSqlTableModel::OnFieldChange);
### 回答1: 你好,关于qttableview数据库中添加数据的问题,可以采用以下步骤: 1. 连接数据库:在代码中使用QSqlDatabase类连接你的数据库。 2. 准备SQL语句:使用QSqlQuery类准备一个SQL语句,用于向表中添加数据。 3. 绑定参数:如果SQL语句中有参数,可以使用QSqlQuery类的bindValue()方法绑定参数。 4. 执行SQL语句:使用QSqlQuery类的exec()方法执行SQL语句,即可将数据插入到数据库表中。 以下是一个简单的示例代码,可以用于向表中添加数据: ```python import sys from PyQt5.QtWidgets import QApplication, QMainWindow, QTableView from PyQt5.QtSql import QSqlDatabase, QSqlQuery, QSqlTableModel class MyMainWindow(QMainWindow): def __init__(self): super().__init__() # 连接数据库 db = QSqlDatabase.addDatabase('QMYSQL') db.setHostName('localhost') db.setUserName('root') db.setPassword('password') db.setDatabaseName('mydatabase') if not db.open(): print("无法连接数据库") sys.exit(-1) # 准备SQL语句 query = QSqlQuery() query.prepare("INSERT INTO mytable (name, age) VALUES (:name, :age)") query.bindValue(":name", "张三") query.bindValue(":age", 25) # 执行SQL语句 if not query.exec(): print("无法插入数据") sys.exit(-1) # 创建表格视图 table_view = QTableView() model = QSqlTableModel() model.setTable("mytable") model.select() table_view.setModel(model) # 将表格视图添加到主窗口 self.setCentralWidget(table_view) if __name__ == '__main__': app = QApplication(sys.argv) window = MyMainWindow() window.show() sys.exit(app.exec_()) ``` 注意,这只是一个简单的示例代码,实际情况可能会更加复杂,需要根据具体的情况进行调整。 ### 回答2: 在Qt中,要向TableView中添加数据库数据,首先需要建立一个数据库连接。可以使用QSqlDatabase类来实现,需要指定数据库的类型、主机名、端口号、用户名和密码等信息。 ```cpp #include <QtSql> #include <QTableView> QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); // 指定数据库类型为SQLite db.setDatabaseName("my_database.db"); // 数据库文件名 if (!db.open()) { qDebug() << "无法建立数据库连接!"; return; } QTableView *tableView = new QTableView; QSqlTableModel *model = new QSqlTableModel; model->setTable("my_table"); // 表名 model->select(); // 从数据库中选取数据 tableView->setModel(model); // 将数据模型设置为TableView的模型 model->insertRow(model->rowCount()); // 插入一行数据 model->setData(model->index(0, 0), "John"); // 设置第一列数据为"John" model->setData(model->index(0, 1), 25); // 设置第二列数据为25 model->submitAll(); // 提交数据数据库 tableView->show(); ``` 以上代码的作用是在TableView中显示数据库中的数据,并向数据库中的表中添加一行数据,然后将更改提交到数据库。用户可以根据需要修改相应的数据库信息、表名和插入的数据内容。 ### 回答3: 在Qt中,要将数据添加到TableView中,需要先连接到数据库并打开相应的表。首先,需要使用QSqlDatabase类连接到数据库,具体步骤如下: 1. 首先,需要包含必要的头文件: #include <QtSql/QSqlDatabase> #include <QtSql/QSqlQuery> #include <QtSql/QSqlError> #include <QtSql/QSqlTableModel> 2. 然后,需要创建一个QSqlDatabase对象,并设置相应的数据库驱动和连接参数: QSqlDatabase db = QSqlDatabase::addDatabase("驱动类型"); db.setHostName("主机名"); db.setDatabaseName("数据库名"); db.setUserName("用户名"); db.setPassword("密码"); 3. 接下来,需要使用open()函数打开数据库连接: if(db.open()) { // 连接成功 } else { // 连接失败 QString error = db.lastError().text(); } 4. 连接成功后,我们可以使用QSqlTableModel类作为TableView的模型,并将其设置为tableView的模型: QSqlTableModel *model = new QSqlTableModel(this, db); model->setTable("表名"); model->select(); tableView->setModel(model); 5. 现在,我们可以使用QSqlQuery类来执行SQL语句,将数据添加到数据库中: QSqlQuery query(db); query.prepare("INSERT INTO 表名 (字段1, 字段2, ...) VALUES (:值1, :值2, ...)"); query.bindValue(":值1", 值1); query.bindValue(":值2", 值2); // 绑定更多的值... if(query.exec()) { // 添加成功 } else { // 添加失败 QString error = query.lastError().text(); } 6. 最后,我们可以更新tableView显示的数据: model->select(); 以上就是在Qt中向TableView添加数据的基本步骤。需要注意的是,要根据具体的数据库设置合适的驱动类型,并确保正确设置连接参数、表名和字段名,以及正确的SQL语句和绑定值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值