范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

CCQt数据库与SqlTableModel组件应用

  SqlTableModel 组件可以将数据库中的特定字段动态显示在 TableView  表格组件中,通常设置QSqlTableModel  类的变量作为数据模型后就可以显示数据表内容,界面组件中则通过QDataWidgetMapper  类实例设置为与某个数据库字段相关联,则可以实现自动显示字段的内容,不仅是显示,其还支持动态增删改查  等各种复杂操作,期间不需要使用任何SQL语句。
  首先绘制好UI界面,本次案例界面稍显复杂,左侧是一个 TableView  组件,其他地方均为LineEdit  组件与Button  组件。
  先来生成数据库表记录,此处我们只需要增加一个 Student  学生表,并插入两条测试数据即可,运行以下代码完成数据创建。#include  #include  #include  #include  #include  #include  #include   QSqlDatabase DB;                     // 数据库连接 void MainWindow::InitSQL() {     QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");     db.setDatabaseName("./lyshark.db");      if (!db.open())      {             return;      }      // 执行SQL创建表     // https://Www.cnbloGs.com/lyshark     db.exec("DROP TABLE Student");     db.exec("CREATE TABLE Student ("                     "id INTEGER PRIMARY KEY AUTOINCREMENT, "                     "name VARCHAR(40) NOT NULL, "                     "sex VARCHAR(40) NOT NULL, "                     "age INTEGER NOT NULL,"                     "mobile VARCHAR(40) NOT NULL,"                     "city VARCHAR(40) NOT NULL)"          );      // 逐条插入数据     db.exec("INSERT INTO Student(name,sex,age,mobile,city) ""VALUES ("lyshark.cnblogs.com","m","25","1234567890","beijing")");     db.exec("INSERT INTO Student(name,sex,age,mobile,city) ""VALUES ("www.lyshark.com","x","22","4567890987","shanghai")");      db.commit();     db.close(); }
  数据库创建后表内记录如下:
  【领QT开发教程 学习资料,点击下方链接莬费领取  ,先码住不迷路~】
  「链接」
  程序运行后我们将在MainWindow::MainWindow(QWidget *parent)  构造函数内完成数据库表记录与TableView  组件字段的对应关系绑定,将数据库绑定到QDataWidgetMapper  对象上,绑定代码如下。MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow) {     ui->setupUi(this);      // 打开数据库     DB=QSqlDatabase::addDatabase("QSQLITE"); // 添加 SQL LITE数据库驱动     DB.setDatabaseName("./lyshark.db");     // 设置数据库名称     if (!DB.open())     {         return;     }      // 打开数据表     tabModel=new QSqlTableModel(this,DB);                             // 数据表     tabModel->setTable("Student");                                    // 设置数据表     tabModel->setEditStrategy(QSqlTableModel::OnManualSubmit);        // 数据保存方式,OnManualSubmit , OnRowChange     tabModel->setSort(tabModel->fieldIndex("id"),Qt::AscendingOrder); // 排序     if (!(tabModel->select()))                                        // 查询数据     {        return;     }      // 设置字段名称     tabModel->setHeaderData(tabModel->fieldIndex("id"),Qt::Horizontal,"Uid");     tabModel->setHeaderData(tabModel->fieldIndex("name"),Qt::Horizontal,"Uname");     tabModel->setHeaderData(tabModel->fieldIndex("sex"),Qt::Horizontal,"Usex");     tabModel->setHeaderData(tabModel->fieldIndex("age"),Qt::Horizontal,"Uage");     tabModel->setHeaderData(tabModel->fieldIndex("mobile"),Qt::Horizontal,"Umobile");     tabModel->setHeaderData(tabModel->fieldIndex("city"),Qt::Horizontal,"Ucity");      theSelection=new QItemSelectionModel(tabModel);                       // 关联选择模型     ui->tableView->setModel(tabModel);                                    // 设置数据模型     ui->tableView->setSelectionModel(theSelection);                       // 设置选择模型     ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows);   // 行选择模式      // 添加数据映射,将选中字段映射到指定编辑框中     // https://www.cnblogs.com/lysharK     dataMapper= new QDataWidgetMapper();     dataMapper->setModel(tabModel);     dataMapper->setSubmitPolicy(QDataWidgetMapper::AutoSubmit);      dataMapper->addMapping(ui->lineEdit_name,tabModel->fieldIndex("name"));          // 设置映射字段     dataMapper->addMapping(ui->lineEdit_mobile,tabModel->fieldIndex("mobile"));      // 第二个映射字段     dataMapper->toFirst();                                                           // 默认选中首条映射记录      // 绑定信号,当鼠标选择时,在底部编辑框中输出     connect(theSelection,SIGNAL(currentRowChanged(QModelIndex,QModelIndex)),this,SLOT(on_currentRowChanged(QModelIndex,QModelIndex)));     getFieldNames(); }  MainWindow::~MainWindow() {     delete ui; }
  绑定成功后运行程序即可看到如下效果,数据库中的记录被映射到了组件内.
  当用户点击TableView  组件内的某一行记录时,则触发MainWindow::on_currentRowChanged  函数。执行获取name/mobile字段,并放入映射数据集中的 lineEdit编辑框中void MainWindow::on_currentRowChanged(const QModelIndex  t, const QModelIndex &previous) {     Q_UNUSED(previous);      dataMapper->setCurrentIndex(current.row());      // 更细数据映射的行号     int curRecNo=current.row();                      // 获取行号     QSqlRecord  curRec=tabModel->record(curRecNo);   // 获取当前记录      QString uname = curRec.value("name").toString();     // 取出数据     QString mobile = curRec.value("mobile").toString();      ui->lineEdit_name->setText(uname);                   // 设置到编辑框     ui->lineEdit_mobile->setText(mobile); }
  运行效果如下:
  增加插入与删除记录实现方法都是调用TabModel  提供的默认函数,通过获取当前选中行号,并对该行号执行增删改查方法即可。// 新增一条记录 // https://www.cnblogS.com/lyshark void MainWindow::on_pushButton_add_clicked() {     tabModel->insertRow(tabModel->rowCount(),QModelIndex());                 // 在末尾添加一个记录     QModelIndex curIndex=tabModel->index(tabModel->rowCount()-1,1);          // 创建最后一行的ModelIndex     theSelection->clearSelection();                                          // 清空选择项     theSelection->setCurrentIndex(curIndex,QItemSelectionModel::Select);     // 设置刚插入的行为当前选择行      int currow=curIndex.row();                                              // 获得当前行     tabModel->setData(tabModel->index(currow,0),1000+tabModel->rowCount()); // 自动生成编号     tabModel->setData(tabModel->index(currow,2),"M");                       // 默认为男     tabModel->setData(tabModel->index(currow,3),"0");                       // 默认年龄0 }  // 插入一条记录 void MainWindow::on_pushButton_insert_clicked() {     QModelIndex curIndex=ui->tableView->currentIndex();     int currow=curIndex.row();                                              // 获得当前行      tabModel->insertRow(curIndex.row(),QModelIndex());     tabModel->setData(tabModel->index(currow,0),1000+tabModel->rowCount()); // 自动生成编号      theSelection->clearSelection();                                         // 清除已有选择     theSelection->setCurrentIndex(curIndex,QItemSelectionModel::Select); }  // 删除一条记录 void MainWindow::on_pushButton_delete_clicked() {     QModelIndex curIndex=theSelection->currentIndex();  // 获取当前选择单元格的模型索引     tabModel->removeRow(curIndex.row());                // 删除最后一行 }  // 保存修改数据 void MainWindow::on_pushButton_save_clicked() {     bool res=tabModel->submitAll();     if (!res)     {         std::cout << "save as ok" << std::endl;     } }  // 恢复原始状态 void MainWindow::on_pushButton_reset_clicked() {     tabModel->revertAll(); }
  增删改查实现如下:
  【领QT开发教程 学习资料,点击下方链接莬费领取  ,先码住不迷路~】
  「链接」
  针对与排序与过滤的实现方式如下,同样是调用了标准函数。// 以Combox中的字段对目标 升序排列 void MainWindow::on_pushButton_ascending_clicked() {     tabModel->setSort(ui->comboBox->currentIndex(),Qt::AscendingOrder);     tabModel->select(); }  // 以Combox中的字段对目标 降序排列 // https://www.Cnblogs.com/LyShark void MainWindow::on_pushButton_descending_clicked() {     tabModel->setSort(ui->comboBox->currentIndex(),Qt::DescendingOrder);     tabModel->select(); }  // 过滤出所有男记录 void MainWindow::on_pushButton_filter_man_clicked() {     tabModel->setFilter(" sex = "M" "); } // 恢复默认过滤器 void MainWindow::on_pushButton_default_clicked() {     tabModel->setFilter(""); }
  过滤效果如下所示:
  批量修改某个字段,其实现原理是首先通过irowCount()  获取记录总行数,然后通过aRec.setValue  设置指定字段数值,并最终tabModel->submitAll()  提交到表格中。void MainWindow::on_pushButton_clicked() {     if (tabModel->rowCount()==0)         return;      for (int i=0;irowCount();i++)     {         QSqlRecord aRec=tabModel->record(i);            // 获取当前记录         aRec.setValue("age",ui->lineEdit->text());      // 设置数据         tabModel->setRecord(i,aRec);     }     tabModel->submitAll();                              // 提交修改 }
  循环修改实现效果如下:
  上方代码中,如果需要修改或增加特定行或记录我们只需要点击相应的按钮,并在选中行直接编辑即可实现向数据库中插入数据,而有时我们不希望通过在原表上操作,而是通过新建窗体并在窗体中完成增删改,此时就需要使用Dialog窗体并配合原生SQL语句来实现对记录的操作了。
  以增加为例,主窗体中直接弹出增加选项卡,并填写相关参数,直接提交即可。// https://www.cnblogs.com/LyShark void MainWindow::on_pushButton_insert_clicked() {     QSqlQuery query;     query.exec("select * from Student where id =-1");    // 查询字段信息,是否存在     QSqlRecord curRec=query.record();                    // 获取当前记录,实际为空记录     curRec.setValue("id",qryModel->rowCount()+1001);      Dialog *WindowPtr=new Dialog(this);     Qt::WindowFlags flags=WindowPtr->windowFlags();     WindowPtr->setWindowFlags(flags | Qt::MSWindowsFixedSizeDialogHint); // 设置对话框固定大小     WindowPtr->setInsertRecord(curRec);                                  // 插入记录     int ret=WindowPtr->exec();                                           // 以模态方式显示对话框     if (ret==QDialog::Accepted)                                          // OK键被按下     {         QSqlRecord  recData=WindowPtr->getRecordData();          query.prepare("INSERT INTO Student(id,name,sex,age,mobile,city)"                       " VALUES(:Id, :Name, :Sex, :Age, :Mobile, :City)");          query.bindValue(":Id",recData.value("id"));         query.bindValue(":Name",recData.value("name"));         query.bindValue(":Sex",recData.value("sex"));         query.bindValue(":Age",recData.value("age"));         query.bindValue(":Mobile",recData.value("mobile"));         query.bindValue(":City",recData.value("city"));          if (query.exec())         {             QString sqlStr=qryModel->query().executedQuery(); // 执行过的SELECT语句             qryModel->setQuery(sqlStr);                       // 重新查询数据         }     }     delete WindowPtr; }
  Dialog增加效果如下:
  文章作者:  lyshark (王瑞)
  文章出处:  https://www.cnblogs.com/LyShark/p/15665737.html

这10款好喝不贵的白酒,价格便宜实惠,老酒友看完直夸好微醺人生,有酒就有故事。市面上的酒水让人眼花缭乱,如何从中挑选好喝不贵的呢?这大概也是困惑大家的问题吧!究竟是要选择名牌酒还是选择价格和口感都好的酒呢?目前,大部分人的普遍现状每天激活数据价值需和产业深度融合数据是数字经济的主要生产要素,现有数据在数字经济中的作用主要集中于产业数字化,即应用于对传统产业的改造升级。资料图在今年的全国两会上,国家数据局获准成立,数字中国建设提速。两会前夕财经聚焦2月份房地产市场更加活跃住房需求进一步释放3月16日,国家统计局公布的数据显示,今年2月份70个大中城市商品住宅销售价格环比上涨城市个数继续增加,各线城市商品住宅销售价格环比总体上涨,二手住宅价格环比全线止跌。专家表示,从从软件名城到软件名城标杆城市,济南软件产业提档升级之路怎么走?软件是新一代信息技术的灵魂,是数字经济发展的基础,是制造强国网络强国数字中国建设的关键支撑。近年来,济南市深入实施工业强市发展战略和数字经济引领战略,软件产业是主攻方向之一。作为全视频平台付费套路几时休新岁伊始,又到了给视频会员续年费的时候。买了几个平台的会员,一年得花费近千元。这不是在夸张,而是当下很多人花费的真实写照。为了追剧看综艺或动漫,消费者往往需要在多个平台充值会员。考隔屏陪伴,让爱更好在身边来源人民网人民日报年轻一代在外成家立业辛勤打拼,父辈祖辈安土重迁难离故土,老年人没有和子女共同居住生活,是时下许多家庭的现实情况。除了情感羁绊,老人们的生活健康安全状况如何,时刻牵到手仅需179的3395,打响2023卷王鼠标第一枪!黑爵AJ199到手仅需179的3395,打响2023卷王鼠标第一枪!黑爵AJ199氦,好久不见。我知道你们都想看啥,但听我说先别急,给我一些时间,你想看的我会做。今天先来看一只前段时间非常火的A刷宝手游,如走钢丝前段时间,火炬之光无限开启了安卓和iOS的预约,预计国服将于今年5月进行公测。无限也是我这两年比较关注的一款产品。倒不是因为我是火炬之光的粉丝。相反,人气最高的2代我甚至都没怎么玩逆水寒老兵服奇遇依思千里送与雀娘传!今日2个奇遇为依思千里送与雀娘传,两者都在汴京御街触发,且都为小吉奇遇,5点奇遇点数。依思千里送在坐标644,379,来回碰撞这个蒋依丝即可触发,任务内容需要我们去给冷血送衣服,送灵犀互娱三国志战棋版主要应用商店下载量已接近400万游戏日报讯3月18日消息,灵犀互娱在3月17日正式上线的三国志战棋版首日冲入iOS免费榜第一位,目前已连续两日保持iOS畅销榜第五位。游戏日报整理主要应用商店数据后发现,该作下载安光刻机不突破,我们设计出1nm芯片,有100自研架构,也没用众所周知,怕龙芯崛起,打破美国的CPU霸权,抢了intelAMD的饭碗,美国又出手,将龙芯也接入了实体清单,限制美国技术设备为龙芯提供服务。很多人表示,龙芯的指令集是自研的Loon
首钢紧急调整引援策略!秦晓雯挽留36超外,解立彬力荐锋线强援北京首钢休赛期进行了阵容大调整,主教练雅尼斯被解立彬取代,常林和刘晓宇先后离开了球队,在外援优先续约名单中,秦晓雯只保留了布朗和迈克瑞。值得一提的是,在北京首钢有信心签下布朗的情况7月31日NBA早报库班东契奇联盟前二火箭季后赛赔率倒数第一北京时间7月31日,过去这一夜,NBA又发生了哪些重大动态?库班东契奇是联盟前二季后赛击败50胜球队最多的球员科比26次居首火箭下赛季进入季后赛的赔率为5500,联盟倒数第一小托马谌龙即将退役,引发球迷讨论!与李宗伟相比,谁更伟大?谌龙即将退役,引发球迷讨论!与李宗伟相比,谁更伟大?近段时间,随着各个国家公布2022羽毛球世锦赛参赛名单,人们关注的焦点已经转移到将于20天后举行的世锦赛身上。关于中国羽毛球队的一夜3大交易动态!湖人有意兰德尔,杜兰特或撤销离队申请北京时间7月31日,NBA自由市场在过去一夜里又传来3个交易动态,湖人这边依然十分活跃,这次又将目光放在旧将兰德尔身上湖人这边也获得一些詹姆斯的报价,只不过都被拒绝了杜兰特这边依然白静去世10年后,再看那场惊天骗局,才明白周成海到底有多冤2004年,演员白静经人介绍,认识了大自己18岁的富商周成海。经过对方不懈追求,白静终于被他的诚心打动,并主动约了他吃饭。结果周成海一个大老板,陪着白静一起在路边吃了一份麻辣烫,最陆毅一家三口罕见同框!43岁陆毅中年发福超油腻,鲍蕾老到不敢认都说爸爸去哪儿节目组有离婚魔咒,但是就算参加这个节目的所有明星夫妻都离婚了,小编还是坚信陆毅和鲍蕾这对神仙眷侣是永远不会分开的,毕竟两人家庭美满恩爱有加,就连生了两个女儿,都像是双刘诗诗到底有多美,看完这几张高清大图你就知道了刘诗诗到底有多美,看完这几张高清大图你就知道了。说起刘诗诗,大家都不陌生,除去刘诗诗演员的身份外,她还是吴奇隆的妻子。刘诗诗是一个地道的北京人,学舞蹈的出身,踏足演艺圈之后作品不断火了糊了毁了,青云志播出6周年,主演境遇各不相同2016年7月31日,是仙侠剧青云志开播的日子,今天刚好是播出6周年。现在再回看这部剧,令人惊叹这真是神仙阵容,而剧中主演们如今的境遇也是各不相同。火了1。李易峰被称为国民校草的李新能源车普及之后加油站何去何从?放心!加油站会改成充电站NO。99逐利的本性决定了能够躺着赚钱的领域会一直躺着赚下去。作者淮河雨欢迎大家点赞评论转发分享题引根据公安部的数据2021年,全国保有机动车(这里讲的是四个轮子及以上)3。95亿致自己的句子,句句走心,道尽人生感悟1敌人变成朋友,就比朋友更可靠,朋友变成敌人,比敌人更危险。2蚁穴虽小,溃之千里。3如果别人朝你扔石头,就不要扔回去了,留着做你建高楼的基石。4发自己的光就好,不要吹灭别人的蜡烛。蓟县吉姆冒险世界假期开始,是不是再找孩子游玩好去处,蓟县吉姆冒险世界绝对是个好地方,话不多说上图。图片就不多放了,大家可以搜搜蓟县吉姆冒险世界游玩攻略,不知道的我可以添加彩霞农家院老板了解。由于蓟