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

Qt开发用于表格QTableView的模型

  如果想使用表格来呈现数据,Qt提供了一个方便的部件QTableWidget,但是直接用它实现一些功能可能比较困难。这里将介绍一种强大、灵活的方式来操作表格。  一、模型/视图架构
  在这个架构中,  模型  用于存储数据,  视图  用于呈现数据,除此之外,还有一个称为  委托  的部分,委托显示视图中的每一项,并为可编辑的项提供合适的编辑器。
  三者的关系如下图所示——
  这篇博客只介绍模型/视图的部分,接下来用一个简单的例子来说明如何使用。  二、要实现的功能
  以网易云音乐为例,它的部分搜索界面是这样的:
  现在,我们依照网易云音乐做一个下面的窗口,并实现额外的一些功能。
  要实现的功能:
  1.  网上搜索  :从网上搜索歌曲的数据并呈现在左边的表格中;
  2.  本地搜索并选中  :在左边的表格中进行搜索,  选中  与关键字相匹配的行;
  3.  本地搜索并过滤  :在左边的表格中进行搜索,只显示与关键字相匹配的行,过滤隐藏不匹配的行。  三、联网搜索1.准备工作
  左边的表格使用   QTableView   。
  为了存储数据,需要使用合适的模型,在这里我们使用   QStandardItemModel   。
  同时为了实现过滤,需要另一个代理模型   QSortFilterProxyModel   。//数据模型 class MusicInfoModel : public QStandardItemModel { public: void loadData(const QString &strKeyword);//用于加载网上搜索得到的数据 } //主窗口 class MainWidget : public QWidget { private slots: void searchOnlineSlot(); //网上搜索 void searchAndSelcLocalSlot(); //本地搜索并选择 void searchAndFilterLocalSlot(); //本地搜索并过滤 private: MusicInfoModel *m_pInfoModel; //数据模型 QSortFilterProxyModel *m_pFilterModel; //过滤代理模型 }
  以上只列出重要的成员变量和成员函数。
  为了方便加载数据,我们将QStandardItemModel  子类化  ,在子类中声明一个加载数据的函数   loadData   。
  在主窗口的构造函数中初始化视图和模型——  m_pInfoModel = new MusicInfoModel(this); m_pFilterModel = new QSortFilterProxyModel(this); m_pFilterModel->setSourceModel(m_pInfoModel); ui.musicInfoTblView->setModel(m_pFilterModel);
  从上面可以看到,表格的视图模型是代理模型filterModel,而不是实际包含数据的模型infoModel。  2.加载数据
  接下来网上搜索,获得数据并加载到表格中
  首先定义歌曲信息的数据结构  //歌曲信息的数据结构 struct SongInfo { public: QString strName; //歌曲标题 QString strSinger; //歌手名字 QString strAlbum; //专辑名称 };
  完成数据模型中加载数据的函数:  void MusicInfoModel::loadData(const QString &strKeyword) { QList listSongInfo; //歌曲信息的list //...省略的步骤 //根据关键字strKeyword从网上搜索 //并将搜索结果存储到listSongInfo中 //清除数据模型中之前存在的数据,并重新设置表头(因为clear会把表头也清除掉) clear(); setHorizontalHeaderLabels(QStringList() << QString::fromLocal8Bit("音乐标题") << QString::fromLocal8Bit("歌手") << QString::fromLocal8Bit("专辑")); //遍历list,将数据存在表中 for (SongInfo songItem : listSongInfo) { QList listItems; QStandardItem *pTitle = new QStandardItem(songItem.strName); QStandardItem *pSinger = new QStandardItem(songItem.strSinger); QStandardItem *pAlbum = new QStandardItem(songItem.strAlbum); listItems << pTitle << pSinger << pAlbum; appendRow(listItems);//加载一行数据 } } 注意:表中的每一项是一个QStandardItem,在加载一行之前,需要先把他们存储在一个QList中,然后调用appendRow函数,一次完成加载3列。
  接下来,我们在主界面中调用数据模型对象的loadData函数,即可将数据全部填到表格中。  四、本地搜索并过滤
  过滤很简单,只需要使用  QSortFilterProxyModel  中的相关函数。  void MainWidget::searchAndFilterLocalSlot() { QString strKeyword = ui.textEdit->text(); m_pFilterModel->setFilterFixedString(strKeyword);//根据字符串过滤 }
  一些有用的函数:
  void setFilterKeyColumn(int column)   :设置根据表的哪一列进行过滤,默认值为0,如果设置成-1,则会根据所有列进行搜索。
  setFilterFixedString(const QString &)   :根据固定的字符串进行过滤。
  setFilterRegExp(const QRegExp &)   :根据正则表达式进行过滤。五、本地搜索并选中void MainWidget::searchAndSelcLocalSlot() { QItemSelection selection; int iFirstSelcRow = -1; for (int i = 0; i < m_pFilterModel->rowCount(); ++i) { //获得每一行的歌名、歌手名、专辑名 QModelIndex songIndex = m_pFilterModel->index(i, 0); QModelIndex singerIndex = m_pFilterModel->index(i, 1); QModelIndex albumnIndex = m_pFilterModel->index(i, 2); QString strSong = m_pFilterModel->data(songIndex).toString(); QString strSinger = m_pFilterModel->data(singerIndex).toString(); QString strAlbumn = m_pFilterModel->data(albumnIndex).toString(); //判断是否符合条件 if (strSong.contains(strKeyword) || strSinger.contains(strKeyword) || strAlbumn.contains(strKeyword)) { if (iFirstSelcRow == -1) { iFirstSelcRow = i; } //增加选中项 QItemSelection rowSelc(songIndex, songIndex); selection.merge(rowSelc, QItemSelectionModel::Select); } } //清除之前所有选中项,并选中现在的所有匹配项 QItemSelectionModel *pSelcModel = ui.musicInfoTblView->selectionModel(); pSelcModel->clearSelection(); pSelcModel->select(selection, QItemSelectionModel::Rows | QItemSelectionModel::Select); //视图滚动到第一个选中项的位置 if (iFirstSelcRow != -1) { ui.musicInfoTblView->scrollTo(m_pFilterModel->index(iFirstSelcRow, 0)); } }
  最终的简陋窗口:
  以上只是视图/模型的使用作简单介绍,更多用法还请在实践中自行查找官方文档。
  点击领取Qt学习资料+视频教程~「链接」

达伦本特内马尔能进阿森纳名单但进不了首发,他总是在受伤直播吧3月10日讯近日,前英格兰国脚达伦本特在节目中谈到了巴黎球星内马尔。本特说道我喜欢阿森纳目前的阵容,给我的话,我会选马丁内利,而不是内马尔。内马尔的能力令人难以置信,但有时不意媒米兰欧冠晋级八强,已经获得7140万欧元奖金直播吧3月10日讯米兰已经成功晋级欧冠八强,而意大利媒体足球与金融统计称,米兰本赛季已经从欧冠赛场获得7140万欧元奖金。米兰获得的奖金中包括参加欧冠小组赛的奖金1564万欧元,参正负值32!勇士头号灾星出炉,疯狂挖坑库里无奈,科尔脸色铁青北京时间3月10日,NBA常规赛勇士做客挑战灰熊。此役上半场双方打得跌宕起伏,首节比赛灰熊狂轰48分,单节领先勇士20分!但第二节,勇士在库里带领下疯狂追分,一度追到只差5分。但在女足国脚张馨踢世界杯是种激励妈妈国脚,这是张馨被外界牢牢贴上的标签。当她每一次出现在公众视野中时,这四个字就是她的名字前几乎从未缺席过的身份备注。而妈妈和国脚,在中国的传统观念里,似乎会形成一种冲突,所以家庭杜兰特的一小步可能影响太阳的一大步啥?赛前自己运球热身都会导致受伤!是的,今天的杜兰特就是这样。今天本该是他在菲尼克斯父老乡亲面前的首秀,结果都还没到上场时间,他直接就高挂免战牌了。通过网上流传的视频片段可以看到,西媒纳赛尔暴怒,巴黎高层今天举行会议讨论加尔蒂去留直播吧3月9日讯Relevo报道,巴黎经历了一场失败,但匆忙和紧急做决定通常不是好建议。然而,大巴黎在慕尼黑的挫折,以及在欧冠淘汰赛出局,很可能会产生一些后果。尤其是在替补席和体育2023第五届环文昌湖半程马拉松赛报名正式开启!上午10点2023第五届环文昌湖半程马拉松赛正式启动报名今年,第五届文马如约而至,比赛将于4月9日上午在文昌湖区环湖赛道鸣枪起跑,赛事规模10000人,其中男女半程马拉松4000人林疯狂在线,杨毅赞中国乔丹打服媒体人昨天3月9号CBA三加时逆转广厦全场比赛,林葳怒砍39分6篮板3抢断2助攻,全场投篮24投13中(三分球7投6中,罚球7中7)第一个加时赛还剩32秒,南京同曦落后5分,又是林葳,林高迪国青的拼劲看到希望,会鞭策每个有责任感的中国足球人直播吧3月10日讯在昨晚进行的U20亚洲杯小组赛第三轮中,U20国足11战平吉尔吉斯斯坦,以小组第二名的身份晋级淘汰赛。据东方体育日报报道,高迪在接受采访时表示,国青队的拼劲会鞭策基翁看看萨利巴那个头球,他做到了你希望他做的一切直播吧3月10日讯今天凌晨结束的欧联杯比赛中,阿森纳和葡萄牙体育22握手言和。赛后,基翁在BT体育的节目中夸赞了萨利巴,称他已经做到了人们希望他做的一切。基翁说关于萨利巴,阿森纳三今晚开播!又有两部新剧上线,都是热门题材,你打算追哪一部?3月9日晚,由毛晓彤张俪领衔主演的心想事成正式开播,真的有被毛晓彤的笑容感染到,天生乐观,虽然卖奶茶不被母亲看好,但一直坚守自己的梦想。当母亲让孙想交生活费的时候,孙想也会觉得母亲
终于get到了冬天穿裤子的美!选对款式学会搭配,准没错冬季的搭配总归是有一些厚重的,很多女人的腿粗,身材比例不是很好,如果给自己挑选裤子,更需要小小谨慎。在秋冬季节给自己搭配裤子的时候也需要结合很多的技巧,不过冬季穿裤子并不难,可以看5战狂揽85板找回状态卡皇总算复苏B站球王上位还得再等等当初为了给特雷杨寻找一名得力的内线护框者,老鹰曾相中了火箭的当家中锋卡佩拉,在20年2月份一笔涉及到森林狼老鹰火箭掘金的四方交易案中,卡佩拉被火箭给送到了亚特兰大,去辅佐老鹰少主特杜兰特与詹姆斯有多没缘分?近1419天12次对决全部完美错过北京时间11月14日,NBA常规赛,湖人主场116103击败篮网,终结了5连败。篮网和湖人这两支顶流队伍展开对决,本身就会引起无限话题。但由于詹姆斯的伤缺和欧文的队内禁赛,让这场比从李铁被带走想到吴京拒挽手李雪健拒广告,公众人物私德多难守这两天前国足主教练李铁被带走的消息被广泛关注,环球时报和极目新闻红星新闻等都做了专题报道,而且透露了一些细节。如,李铁是从足协训练班上被一带走,直到培训结束也没回来,李铁个人社交账狂轰51分还是输!东部第一黑马4连败轰然倒下,想忘记詹姆斯太难本赛季NBA最大的空砍诞生。骑士和森林狼的比赛,骑士球星加兰德全场出战40分钟,31投16中,三分球15中10,罚球13中9,狂轰51分2篮板6助攻1抢断。然而骑士还是12412920年之后新秀成色排名,火箭后场组合排第一,马刺星工场名副其实NBA作为世界上水平最高,薪金最高也是淘汰率最高的篮球联赛,每年都会有至少60名新人涌入这个聚宝盆中,而这些人也就成为了那些联盟垫底球队崛起的希望,近日statmuse就对2020大帝591187准四双,历史第一人11月14日,费城主场105比98击败西部第一的爵士。大帝全场轰下59分11篮板8助攻7盖帽准四双,刷爆纪录。此役,大帝破了几项记录59分创下职业生涯新高59分是本赛季联盟个人得分减重哥约翰逊去世,年仅38岁今天,UFC著名选手减重哥安东尼约翰逊(AnthonyJohnson)因病去世,年仅38岁。约翰逊2006年开始职业MMA生涯,2007年加入UFC。之所以称为减重哥,就是因为他打八卦掌三十六歌诀四十八法摘录八卦掌三十六歌诀和四十八法于拳友共享。像整理公开该拳论的李子鸣老前辈致敬!八卦掌练法的三十六歌诀和手法的四十八法诀,是董海川先师口传下来的惟一经典著作,每一句都含有极其深刻的意丁俊晖强势晋级,5连鞭打蒙霍师傅,奥沙利文颜丙涛14号出战北京时间11月14日清晨,2022斯诺克英锦赛正赛第二个比赛日结束,当天中国选手共2人参赛登场亮相,包括丁俊晖吕昊天。其中丁俊晖以63战胜霍金斯。吕昊天则被淘汰出局,其中吕昊天46恭喜蔡斌!恭喜中国女排!国际排联官宣,2023国家联赛举办地出炉北京时间11月14日,中国女排传来最新消息,据国内媒体新浪体育报道,国际排联官宣了明年国家女排联赛的举办地,第二站比赛,中国女排可以在国内进行,而这样的情况也引来了很多球迷的关注和