安庆大理运城常德铜陵江西
投稿投诉
江西南阳
嘉兴昆明
铜陵滨州
广东西昌
常德梅州
兰州阳江
运城金华
广西萍乡
大理重庆
诸暨泉州
安庆南充
武汉辽宁

CCQt数据库与SqlTableModel组件应用

7月23日 发如雪投稿
  SqlTableModel组件可以将数据库中的特定字段动态显示在TableView表格组件中,通常设置QSqlTableModel类的变量作为数据模型后就可以显示数据表内容,界面组件中则通过QDataWidgetMapper类实例设置为与某个数据库字段相关联,则可以实现自动显示字段的内容,不仅是显示,其还支持动态增删改查等各种复杂操作,期间不需要使用任何SQL语句。
  首先绘制好UI界面,本次案例界面稍显复杂,左侧是一个TableView组件,其他地方均为LineEdit组件与Button组件。
  先来生成数据库表记录,此处我们只需要增加一个Student学生表,并插入两条测试数据即可,运行以下代码完成数据创建。includeiostreamincludeQSqlDatabaseincludeQSqlErrorincludeQSqlQueryincludeQSqlRecordincludeQtSqlincludeQDataWidgetMapperQSqlDatabaseDB;数据库连接voidMainWindow::InitSQL(){QSqlDatabasedbQSqlDatabase::addDatabase(QSQLITE);db。setDatabaseName(。lyshark。db);if(!db。open()){}执行SQL创建表https:Www。cnbloGs。comlysharkdb。exec(DROPTABLEStudent);db。exec(CREATETABLEStudent(idINTEGERPRIMARYKEYAUTOINCREMENT,nameVARCHAR(40)NOTNULL,sexVARCHAR(40)NOTNULL,ageINTEGERNOTNULL,mobileVARCHAR(40)NOTNULL,cityVARCHAR(40)NOTNULL));逐条插入数据db。exec(INSERTINTOStudent(name,sex,age,mobile,city)VALUES(lyshark。cnblogs。com,m,25,1234567890,beijing));db。exec(INSERTINTOStudent(name,sex,age,mobile,city)VALUES(www。lyshark。com,x,22,4567890987,shanghai));db。commit();db。close();}
  数据库创建后表内记录如下:
  【领QT开发教程学习资料,点击下方链接莬费领取,先码住不迷路】
  链接
  程序运行后我们将在MainWindow::MainWindow(QWidgetparent)构造函数内完成数据库表记录与TableView组件字段的对应关系绑定,将数据库绑定到QDataWidgetMapper对象上,绑定代码如下。MainWindow::MainWindow(QWidgetparent):QMainWindow(parent),ui(newUi::MainWindow){uisetupUi(this);打开数据库DBQSqlDatabase::addDatabase(QSQLITE);添加SQLLITE数据库驱动DB。setDatabaseName(。lyshark。db);设置数据库名称if(!DB。open()){}打开数据表tabModelnewQSqlTableModel(this,DB);数据表tabModelsetTable(Student);设置数据表tabModelsetEditStrategy(QSqlTableModel::OnManualSubmit);数据保存方式,OnManualSubmit,OnRowChangetabModelsetSort(tabModelfieldIndex(id),Qt::AscendingOrder);排序if(!(tabModelselect()))查询数据{}设置字段名称tabModelsetHeaderData(tabModelfieldIndex(id),Qt::Horizontal,Uid);tabModelsetHeaderData(tabModelfieldIndex(name),Qt::Horizontal,Uname);tabModelsetHeaderData(tabModelfieldIndex(sex),Qt::Horizontal,Usex);tabModelsetHeaderData(tabModelfieldIndex(age),Qt::Horizontal,Uage);tabModelsetHeaderData(tabModelfieldIndex(mobile),Qt::Horizontal,Umobile);tabModelsetHeaderData(tabModelfieldIndex(city),Qt::Horizontal,Ucity);theSelectionnewQItemSelectionModel(tabModel);关联选择模型uitableViewsetModel(tabModel);设置数据模型uitableViewsetSelectionModel(theSelection);设置选择模型uitableViewsetSelectionBehavior(QAbstractItemView::SelectRows);行选择模式添加数据映射,将选中字段映射到指定编辑框中https:www。cnblogs。comlysharKdataMappernewQDataWidgetMapper();dataMappersetModel(tabModel);dataMappersetSubmitPolicy(QDataWidgetMapper::AutoSubmit);dataMapperaddMapping(uilineEditname,tabModelfieldIndex(name));设置映射字段dataMapperaddMapping(uilineEditmobile,tabModelfieldIndex(mobile));第二个映射字段dataMappertoFirst();默认选中首条映射记录绑定信号,当鼠标选择时,在底部编辑框中输出connect(theSelection,SIGNAL(currentRowChanged(QModelIndex,QModelIndex)),this,SLOT(oncurrentRowChanged(QModelIndex,QModelIndex)));getFieldNames();}MainWindow::MainWindow(){}
  绑定成功后运行程序即可看到如下效果,数据库中的记录被映射到了组件内。
  当用户点击TableView组件内的某一行记录时,则触发MainWindow::oncurrentRowChanged函数。执行获取namemobile字段,并放入映射数据集中的lineEdit编辑框中voidMainWindow::oncurrentRowChanged(constQModelIndext,constQModelIndexprevious){QUNUSED(previous);dataMappersetCurrentIndex(current。row());更细数据映射的行号intcurRecNocurrent。row();获取行号QSqlRecordcurRectabModelrecord(curRecNo);获取当前记录QStringunamecurRec。value(name)。toString();取出数据QStringmobilecurRec。value(mobile)。toString();uilineEditnamesetText(uname);设置到编辑框uilineEditmobilesetText(mobile);}
  运行效果如下:
  增加插入与删除记录实现方法都是调用TabModel提供的默认函数,通过获取当前选中行号,并对该行号执行增删改查方法即可。新增一条记录https:www。cnblogS。comlysharkvoidMainWindow::onpushButtonaddclicked(){tabModelinsertRow(tabModelrowCount(),QModelIndex());在末尾添加一个记录QModelIndexcurIndextabModelindex(tabModelrowCount()1,1);创建最后一行的ModelIndextheSelectionclearSelection();清空选择项theSelectionsetCurrentIndex(curIndex,QItemSelectionModel::Select);设置刚插入的行为当前选择行intcurrowcurIndex。row();获得当前行tabModelsetData(tabModelindex(currow,0),1000tabModelrowCount());自动生成编号tabModelsetData(tabModelindex(currow,2),M);默认为男tabModelsetData(tabModelindex(currow,3),0);默认年龄0}插入一条记录voidMainWindow::onpushButtoninsertclicked(){QModelIndexcurIndexuitableViewcurrentIndex();intcurrowcurIndex。row();获得当前行tabModelinsertRow(curIndex。row(),QModelIndex());tabModelsetData(tabModelindex(currow,0),1000tabModelrowCount());自动生成编号theSelectionclearSelection();清除已有选择theSelectionsetCurrentIndex(curIndex,QItemSelectionModel::Select);}删除一条记录voidMainWindow::onpushButtondeleteclicked(){QModelIndexcurIndextheSelectioncurrentIndex();获取当前选择单元格的模型索引tabModelremoveRow(curIndex。row());删除最后一行}保存修改数据voidMainWindow::onpushButtonsaveclicked(){boolrestabModelsubmitAll();if(!res){std::coutsaveasokstd::}}恢复原始状态voidMainWindow::onpushButtonresetclicked(){tabModelrevertAll();}
  增删改查实现如下:
  【领QT开发教程学习资料,点击下方链接莬费领取,先码住不迷路】
  链接
  针对与排序与过滤的实现方式如下,同样是调用了标准函数。以Combox中的字段对目标升序排列voidMainWindow::onpushButtonascendingclicked(){tabModelsetSort(uicomboBoxcurrentIndex(),Qt::AscendingOrder);tabModelselect();}以Combox中的字段对目标降序排列https:www。Cnblogs。comLySharkvoidMainWindow::onpushButtondescendingclicked(){tabModelsetSort(uicomboBoxcurrentIndex(),Qt::DescendingOrder);tabModelselect();}过滤出所有男记录voidMainWindow::onpushButtonfiltermanclicked(){tabModelsetFilter(sexM);}恢复默认过滤器voidMainWindow::onpushButtondefaultclicked(){tabModelsetFilter();}
  过滤效果如下所示:
  批量修改某个字段,其实现原理是首先通过irowCount()获取记录总行数,然后通过aRec。setValue设置指定字段数值,并最终tabModelsubmitAll()提交到表格中。voidMainWindow::onpushButtonclicked(){if(tabModelrowCount()0)for(inti0;itabModelrowCount();i){QSqlRecordaRectabModelrecord(i);获取当前记录aRec。setValue(age,uilineEdittext());设置数据tabModelsetRecord(i,aRec);}tabModelsubmitAll();提交修改}
  循环修改实现效果如下:
  上方代码中,如果需要修改或增加特定行或记录我们只需要点击相应的按钮,并在选中行直接编辑即可实现向数据库中插入数据,而有时我们不希望通过在原表上操作,而是通过新建窗体并在窗体中完成增删改,此时就需要使用Dialog窗体并配合原生SQL语句来实现对记录的操作了。
  以增加为例,主窗体中直接弹出增加选项卡,并填写相关参数,直接提交即可。https:www。cnblogs。comLySharkvoidMainWindow::onpushButtoninsertclicked(){QSqlQquery。exec(selectfromStudentwhereid1);查询字段信息,是否存在QSqlRecordcurRecquery。record();获取当前记录,实际为空记录curRec。setValue(id,qryModelrowCount()1001);DialogWindowPtrnewDialog(this);Qt::WindowFlagsflagsWindowPtrwindowFlags();WindowPtrsetWindowFlags(flagsQt::MSWindowsFixedSizeDialogHint);设置对话框固定大小WindowPtrsetInsertRecord(curRec);插入记录intretWindowPtrexec();以模态方式显示对话框if(retQDialog::Accepted)OK键被按下{QSqlRecordrecDataWindowPtrgetRecordData();query。prepare(INSERTINTOStudent(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()){QStringsqlStrqryModelquery()。executedQuery();执行过的SELECT语句qryModelsetQuery(sqlStr);重新查询数据}}deleteWindowP}
  Dialog增加效果如下:
  文章作者:lyshark(王瑞)
  文章出处:https:www。cnblogs。comLySharkp15665737。html
投诉 评论 转载

剧烈疼痛!世界杯倒计时14天,德国坏消息,32岁巨星或无缘卡世界杯开幕在即,德国队却受到重大噩耗。上周末,多特蒙德主场3球大胜波鸿,队长罗伊斯在下半场替补亮相,只踢了24分钟,看起来十分小心谨慎,不敢做稍微大点的动作。好在罗伊斯坚持完赛……云南9个小众宝藏旅行目的地,八分低调,十分绝美,第1个就心动云南,一个神奇的省份!这里有风花雪月、四季如春,有奔流不息的大江、大河,有孕育生命的热带雨林、令人心生敬畏的高冷雪峰,有静谧旖旎的高原湖泊,还是中华民族56个民族中25个……CCQt数据库与SqlTableModel组件应用SqlTableModel组件可以将数据库中的特定字段动态显示在TableView表格组件中,通常设置QSqlTableModel类的变量作为数据模型后就可以显示数据表内容,界……高糖的健康饮食,五谷杂粮中,少不了这五种大家知道,糖分的来源主要是碳水化合物碳水化合物的来源也主要由小米、高粱米、玉米和薯类,都是碳水化合物的来源之一,那么是不是意味着不吃不喝才行了?那肯定不行,不吃不喝死的更……横空出世!216cm中锋引外国球探注意,或成为周琦接班人前段时间,中国男篮在亚青赛上,虽然遗憾输给了韩国男篮,但却有一位球员横空出世,他就是17岁的杨翰森,为此还引起了外国球探的注意。毕竟,在世青赛上惊艳的表现,折服了许多球迷,对杨……拯救全队!中国女排首秀大逆转,丁霞登上热搜,郎平她越老越妖万众瞩目的女排世界联赛,中国女排首先上演了大逆转,在先输一局的情况下,连续赢下3局,最终3比1击败荷兰女排,拿到东京奥运会之后的首场胜利,对中国女排来说拿下开门红,不仅给了年轻……资讯全球电池联盟宣布新一任董事会,宁德时代特斯拉等入选文:懂车帝原创魏微〔懂车帝原创行业〕11月24日,宁德时代宣布入选全球电池联盟(GlobalBatteryAlliance)新一任董事会,任期为2023年4月至2024年……中国人喜欢晒被子,为什么外国人却从不晒被子?留学生说出大实话中国人喜欢晒被子,为什么外国人却从不晒被子?(此处已添加小程序,请到今日头条客户端查看)如果遇上一个阳光充足的好天气,大家都愿意把房间里的被子拿出去晒一下,达到除尘消毒的……对抗失眠的十款养生粥经常会用粉丝问,有没有解决失眠的方法,今天给大家介绍下对抗失眠的10种养生粥1、安神汤蒸生百合,加入蛋黄,用水搅拌,加入少许冰糖,煮沸后再用水搅拌,睡前一小时饮用。……塔克拉玛干沙漠出现大量湖泊,百年难得一见胡杨、塔里木、雪莲三个不同的词,形容的都是新疆的塔克拉玛干沙漠。据了解,新疆境内有大小沙漠30多万平方公里,沙漠中有湖泊50多个。湖泊大都位于沙山之间。一、什么是塔克拉玛……这个节日不一般,从设立到标识,都源自中华传统文化感悟中华文化,享受美好旅程。今天是5月19日,中国旅游日。那么该节日的设立由来是什么?为什么要选择这一天?带上你的疑问,让我们一起来了解相关知识。节日设立2011年……三个月带货20亿元,东方甄选上线APP打造私域电商模式6月初的突然走红后,东方甄选一举登上抖音主播带货榜首,还屡次跻身抖音热榜。在过去三个月的GMV达到了20亿左右,毛利率近38。东方甄选主打的知识直播风格,成为国内直播电商……
今天起,正式开启!暴风雨的洗(喜)礼Arthas基础教程(基于官方文档)2017年男排主力陆飞病逝,留下2个年幼女儿,惠若琪送15。开车用手机导航竟然也违规?iPad蓝牙可以用吗?吴敏霞婆婆首次出境,打扮朴素哭诉没享天伦!对儿媳的称呼显疏离恭喜刘国梁!33岁国乒悍将112重挫日乒锐气,赛后采访道出1关于补钙的那些事,你真的补对了吗?这4个误区很多人都中招了要做怎样的人,以后就会有怎样的人生!要做怎样的人自已决定足坛豪门命运迥异!皇马诱惑力已下降,曼城创造王朝指日可待还是小米懂用户!这款性价比好物被大家爱疯了脉冲星日报四十二期都用上量子手机了吗中国3个最有名的温泉,泡温泉不用去日本了怎样构成严重污染环境罪?十二星座花及花语起诉离婚没有出轨证据怎么办?慧眼看世界狐狸和乌鸦续写我经历过的都值得锁客八步,精确锁定目标顾客人群毛阿敏开心走机场,大夏天戴毛线帽,看着都热知识关雎是近体诗吗包包可以用酒精擦吗牛皮包的保养方法顽强的小草

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找七猫云易事利