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

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

酒店地方志浙江不止于酒店浙江作为中国改革开放的排头兵,经济发展一直名列前茅,浙商也在中国及世界经济舞台发挥着重要的力量。出现了如马云郭广昌宗庆后等一众知名企业家,浙江在我国经济发展中占据重要的位置。杭州温建武十三年,刘秀大封功臣,从哪可以看出带有抑制功臣的目的?东汉政权的建立,依仗的是能征善战的功臣。天下统一后,方论功赏,以答大勋,对功臣进行封侯进爵是理所当然的事情。如果您喜欢该作品,看更多精彩内容,欢迎点赞加关注!建武十三年的分封按照袁上达天听下挟刺史,延续数百年的典签制度,官小权重的缘由典签制度的来源宋孝武帝大明年间457一464年宋明帝泰始年间464一471年,不论宗王是否年长,也不论是谁出镇,都必须派典签,刺史不得专权。典签由于掌握了监督权及向皇帝汇报的权力,提振新能源汽车地方监管破题供应链金融本报记者慈玉鹏北京报道近期,深圳银保监局联合多部门出台深圳金融支持新能源汽车产业链高质量发展的意见(以下简称意见),围绕新能源汽车发展给予金融支支持重庆银保监局近期也发文,联合中国看到胎儿面部的进化过程,孕妈每一处都长在我意想不到的地方从知道怀孕开始,很多孕妈妈都会幻想肚子里的宝宝长什么样子。像妈妈好呢,还是像爸爸好呢,眼睛像谁好呢,鼻子嘴巴又像谁好呢。当看完胎儿面部的进化过程图后,孕妈真棒,每一处都长在我意想不商鞅这个变法功臣,为什么会有那么惨的结局?流血的历史教训啊公元前338年,秦国变法大功臣商鞅,匆匆带上家人,一路往封地逃去。这一年,秦孝公死了,他的儿子秦惠文王即位,成为新一代秦国国君。新官上任三把火,第一把火就烧到了变法功臣商鞅身上。这西汉李广利向匈奴投降后,匈奴发生了一件怪事,至今都无法解释西汉时期的李广利是一位屡战屡败的名将,凭借外戚身份迅速走上高位。他率军三次攻打匈奴,前两次败兵而归,第三次一开始取得了一些优势,结果他带兵冒进,最后兵败被俘。李广利被俘后很快投降了科大讯飞3月1日接受机构调研,汇添富基金淳厚基金参与2023年3月1日科大讯飞(002230)发布公告称公司于2023年3月1日接受机构调研,汇添富基金李云鑫淳厚基金翟羽佳陈基明田文天参与。具体内容如下问公司在ChatGPT方面有哪朗读亭里书声朗声入人心催人进红网时刻新闻记者孔晴丽长沙报道时代呼唤着我们,人民期待着我们,唯有矢志不渝笃行不怠,方能不负时代不负人民在长沙市芙蓉区马王堆街道强国朗读亭里,只需拿出手机扫码便能听到由不同党员代表73保超瓦尔纳黑海vs贝迪夫主力含泪离队,人心散了队伍还好带吗?3月4日周六晚上2300昨天,2月28日,保加利亚冬季转会窗关闭前。贝迪夫的队长内德列夫以15万欧元的价格,转会去了卢多戈雷茨。现年30岁的内德列夫司职中场,是保加利亚国脚。他出自河南巩义杜甫故里读诗史千古绝唱思诗圣高尚情操从庭前八月梨枣熟,一日上树能千回的童年,到十年漫游十年求官十年漂泊的一生,杜甫忧国忧民,挥毫赋诗,留下了1400多首脍炙人口的诗篇。他亦是诗坛承前继后继往开来的集大成者,诗被后世称
阿森西奥回应巴萨传闻未来不好说,但我想留在皇马皇马前锋阿森西奥接受了西班牙六台的专访你觉得是不是有很多不合适的,过分的批评针对西班牙国家队?很多人都喜欢给国家队制造麻烦,给任何的球队造成损害。我们要做的就是远离这些声音,因为这比利时VS加拿大本场比赛的亚洲数据普遍给到比利时让0。5球,机构目前给出比利时让0。5球起到了很不错的支持力度。对双方来说都是机会!我是赵平!加油!我是小崔!!!你值得拥有!点赞分享!关注!我会把锡伯杜谈赢球队员们配合很棒对手很难将重点放在某位球员身上直播吧11月22日讯今日NBA常规赛,尼克斯129119战胜雷霆。赛后,尼克斯主教练锡伯杜接受了记者采访。谈到比赛,锡伯杜讲道我认为球员彼此间配合地很棒,并且打出了很多精彩的战术,德转列世界杯C组球员身价榜劳塔罗居首,梅西第四,莱万第五直播吧11月22日讯本届世界杯C组的比赛已经正式打响,德转也盘点了C组四支球队身价最高的前十名球员,其中劳塔罗以7500万欧居首,梅西5000万欧第四,阿根廷七人上榜,莱万位居第五定了!国际乒联官宣第47周世界排名张本智和第二,王艺迪第四北京时间11月22日,国际乒联官网宣布了第47周世界排名。男单变化较大,樊振东以7700的积分继续领跑积分榜,张本智和(4550)第二,马龙(4400)第三,王楚钦(4345)第四黑米能抗癌?为什么不建议人们随便吃黑米?医生告诉你真相导语黑米属于是我国稻种资源当中非常有特色的一种类型,而黑米集天然的色香味营养以及食疗于一体。黑米呈现黑色或是黑褐色,营养价值特别丰富,而且也有着非常好的药用价值,不仅能够熬煮成粥,大象起舞!中字头板块异军突起,8家高增长股名单梳理,建议收藏中字头板块崛起事件驱动上,一方面,在近期召开的2022金融街论坛年会上,顶层设计提出要深入研究成熟市场估值理论的使用场景,把握好不同类型上市公司的估值逻辑,探索建立具有中国特色的估卡塔尔世界杯开幕在冰冷的冬天四年一度的世界杯盛事在俄罗斯如火如荼地进行着,借时差的东风,国内的球迷们可以不用熬深夜就能观看世界杯赛事了。这段日子,身边充斥着太多关于足球的话题。德国队爆冷,昨天亏掉一个肾。小日中国第一,世界第二,海信广告踢出世界杯擦边球引发热议(文韩宜珈编辑周远方)11月20日傍晚,2022年卡塔尔世界杯开幕。虽然没有中国国足,但中国无处不在。根据GlobalData公布的数据,在今年的卡塔尔世界杯上,中国企业成为本届世本戴维斯威尔士没有发挥出正常水准,但好在贝尔帮了我们在此前结束的卡塔尔世界杯B组小组赛的首轮中,威尔士凭借着贝尔的点射破门,11战平美国。赛后,威尔士中卫本戴维斯接受了媒体的采访谈到了自己对比赛的看法和对贝尔的评价。关于对本场比赛的足坛重磅!曼联官方C罗离队,立即生效直播吧11月23日讯今天凌晨,曼联官方发布重磅公告,C罗将离开曼联,立即生效。公告如下克里斯蒂亚诺罗纳尔多将在双方同意的情况下离开曼联,立即生效。俱乐部感谢他在老特拉福德的两个赛季