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

Qt之自定义检索框

  1、效果展示
  今天这篇文章主要讲解的是自定义搜索框,不仅仅支持搜索,而且可以支持搜索预览,具体请看效果图1。网上也有一些比较简单明了的自定义搜索框,比如Qt之自定义搜索框 ,讲的也比较详细,不过本文的侧重点不仅仅是搜索,而且包括了检索功能。有兴趣的小伙伴可以看下步骤3的思路讲解。
  图1 自定义搜索框 2、功能分析
  这个自定义搜索框支持输入一定的数据源,然后通过检索窗口进行搜索数据,匹配到的数据会优先展示到预览下拉框,预览窗口支持hover高亮整行。仔细阅读demo源码的同学可能就会发现其实这个搜搜框的左侧又一个按钮是可以点击的,但是目前还没有添加具体的点击功能。了解了这个控件的功能之后,如果觉得对你有用,那么就可以接着继续往下看实现流程。 3、思路讲解
  问题分析:
  1、数据源存储在哪儿?怎么实现检索
  2、弹出式下拉框显示和隐藏控制?位置同步?
  3、鼠标hover状态的颜色设置?
  首先在讲解源码之前,我抛出了3个问题,有精力的同学可以先思考下这几个问题,然后在接着往下看,下边我也会逐一说明这个些问题。
  源码讲解:
  1、使用到的类:
  StockSortFilterProxyModel:过滤数据源,该model上的数据索引直接供视图展示
  StockTableView:自定义视图,用于显示预览数据
  StockListWidget:自定义搜索框
  StockItemDelegate:自定义委托,提供自定义绘图
  上边4个类是完成自定义搜索框的自定义类,当然除了上述4个类以外,还用到了qt自带的一些类,更好的理解这些类,那么这个自定义控件的思路也就显得异常好理解。
  2、头文件说明 委托:负责视图绘制  1 class IView;  2   3 struct StockItemDelegatePrivate  4 {  5     int column = 1;//进度条所在列,下标从0开始  6     QTableView * parent = nullptr;  7     IView * view = nullptr;  8 };  9  10 class StockItemDelegate : public QStyledItemDelegate 11 { 12     Q_OBJECT 13  14 public: 15     StockItemDelegate(QTableView * parent = nullptr); 16     ~StockItemDelegate(){}; 17  18 public: 19     void setView(IView * view); 20  21 protected: 22     virtual void paint(QPainter * painter 23         , const QStyleOptionViewItem & option 24         , const QModelIndex & index) const Q_DECL_OVERRIDE; 25  26     virtual QSize sizeHint(const QStyleOptionViewItem &option, 27         const QModelIndex &index) const Q_DECL_OVERRIDE; 28  29 private: 30     QScopedPointer d_ptr; 31 };窗口布局:StockTableView是专门用来展示检索后的数据,StockListWidget是窗口布局  1 class IView  2 {  3 public:    4     virtual void SetMouseOver(int) = 0;  5 };  6   7 class StockTableView : public QTableView, public IView   8 {  9     Q_OBJECT 10 public:    11     StockTableView(QStandardItemModel * model, QWidget * parent = 0); 12             13 public: 14     void SetMouseOver(int); 15  16 protected: 17     virtual void mouseMoveEvent(QMouseEvent * event) override; 18     virtual void leaveEvent(QEvent * event) override; 19     virtual void mousePressEvent(QMouseEvent * event) override; 20  21 private: 22     int currHovered; 23     void disableMouseOver(); 24  25 private: 26     QStandardItemModel * m_pSourceModel; 27 }; 28  29 struct StockListWidgetPrivate; 30  31 class StockListWidget : public QWidget, public QAbstractNativeEventFilter 32 { 33     Q_OBJECT 34  35 public: 36     StockListWidget(QWidget * parent = nullptr); 37     ~StockListWidget(); 38  39 public slots: 40     void NativeParentWindowMove(); 41  42 protected: 43     virtual void moveEvent(QMoveEvent * event) override; 44     virtual bool nativeEventFilter(const QByteArray & eventType, void * message, long * result) override; 45  46 private: 47     void InitializeUI(); 48  49 private: 50     QScopedPointer d_ptr; 51 };数据源:根据模式串匹配检索后的数据,并负责通知视图进行更新展示  1 class StockSortFilterProxyModel : public QSortFilterProxyModel  2 {  3     Q_OBJECT  4   5 public:  6     StockSortFilterProxyModel(QObject *parent = nullptr);  7     ~StockSortFilterProxyModel();  8   9     void SetFilterContext(const QString & pattern); 10  11 protected: 12     bool lessThan(const QModelIndex &left 13                   , const QModelIndex &right) const; 14     bool filterAcceptsRow(int source_row 15                           , const QModelIndex & source_parent) const; 16 private: 17     size_t sortColumn = 0; 18 };
  3、窗口布局:
  窗口布局:也就是这个检索框长什么样子,效果展示图1中就可以看到,在这个dmeo中,也就是StockListWidget类,该类使用了一个水平布局添加了按钮和文本输入框。当文本输入框内容发生变化时,启动检索,然后刷新视图上的数据,具体看源码  1 connect(d_ptr->m_pSearchLineEdit, &QLineEdit::textChanged, this, [this](const QString & text){  2         if (d_ptr->m_pFilterModel)  3         {  4             d_ptr->m_pFilterModel->SetFilterContext(text);//根据检索内容刷新model  5         }  6         if (d_ptr->m_pStockPreviewWidget)  7         {  8             d_ptr->m_pStockPreviewWidget->move(d_ptr->m_pTitleWidget->mapToGlobal(QPoint(0, d_ptr->m_pTitleWidget->height())));  9             int rowHeight = d_ptr->m_pStockPreview->rowHeight(0); 10             int rowCount = d_ptr->m_pFilterModel->rowCount(); 11             d_ptr->m_pStockPreviewWidget->setFixedHeight(rowHeight * rowCount > DropWidgetMaxHeight ? DropWidgetMaxHeight : rowHeight * rowCount); 12             d_ptr->m_pStockPreviewWidget->show();//修正view高度,挪动位置并显示 13         } 14     });
  4、数据存储
  qt提供了一些列的model来供我们使用,有可以存放数据的,也有一些只供我们使用接口的,在这个demo中我使用的是QStandardItemModel,他可以存储我们所需要检索的源数据,然后qt还提供了一个检索model,QSortFilterProxyModel,我继承该model可以做自己想做的检索实现,然后把检索到的数据索引通知到视图,这样就完成了数据更新,具体关联代码如下: 1     StockItemDelegate * itemDelegate = new StockItemDelegate(d_ptr->m_pStockPreview); 2     d_ptr->m_pStockPreview->setItemDelegate(itemDelegate); 3     itemDelegate->setView(d_ptr->m_pStockPreview);//委托关联到视图上,负责数据绘制 4  5     d_ptr->m_pStockPreviewWidget->setWindowFlags(Qt::FramelessWindowHint | Qt::Tool | Qt::Popup); 6  7     d_ptr->m_pFilterModel->setSourceModel(d_ptr->m_pListModel);//检索model检索的数据源设置 8     d_ptr->m_pStockPreview->setModel(d_ptr->m_pFilterModel);//视图展示的model为检索后的model
  数据检索实现,我匹配的是每一列是否为需要的值,也就是如果这一行中某一列满足要求都认为该行满足要求  1 bool StockSortFilterProxyModel::filterAcceptsRow(int source_row  2                                               , const QModelIndex & source_parent) const  3 {  4     QRegExp regExp = filterRegExp();  5     bool result = false;  6     for (int i = 0; i < sortColumn; ++i)//循环匹配所有的列,有一列满足要求就返回true  7     {  8         QModelIndex index = sourceModel()->index(source_row, i, source_parent);  9         QString context = sourceModel()->data(index).toString(); 10  11         if (regExp.isEmpty() == false) 12         { 13             QString regExpStr = regExp.pattern(); 14             result = regExp.exactMatch(context); 15         } 16  17         if (result) 18         { 19             break; 20         } 21     } 22  23     return result; 24 }
  5、视图显示
  关于视图显示,主要是视图显示位置和显示时机
  显示时机:编辑框内容发现变化的时候显示,编辑框失去焦点的时候隐藏,这样也就存在一个问题,当主窗口拖动时,视图位置更新怎么做?
  显示位置:当主窗口位置移动时,更新视图位置,这个方法看一参考qt捕获全局windows消息。
  点击领取Qt学习资料+视频教程~「链接」
  6、视图背景色
  视图背景色在添加数据源的时候设置了默认背景色,在后hover的时候重新设置背景色,hover失效后再恢复默认背景色,实现行hover代码如下:  1 void StockTableView::SetMouseOver(int row)  2 {  3     if (row == currHovered)  4     {  5         return;  6     }  7   8     StockSortFilterProxyModel * sortModel = static_cast(model());  9     if (sortModel->rowCount() <= row) 10     { 11         return; 12     } 13     for (int col = 0; col < sortModel->columnCount(); col++)//循环遍历,设置指定行中每一个item的背景色 14     { 15         QModelIndex index = sortModel->index(row, col); 16         if (index.isValid()) 17         { 18             if (QStandardItem * item = m_pSourceModel->itemFromIndex(sortModel->mapToSource(index))) 19             { 20                 item->setBackground(QBrush(QColor(43, 92, 151))); 21             } 22         } 23     } 24  25     if (currHovered != -1) 26     { 27         disableMouseOver();//恢复之前hover的行 28     } 29     currHovered = row; 30 }
  转载:https://www.cnblogs.com/swarmbees/p/6032744.html
  作者:朝十晚八 or  Twowords

春节吃得太油腻,这些食物有助于刮油春节假期已过去无论是睡眠还是饮食都慢慢回归到平常的节奏假期期间难免大鱼大肉很多人都想着该刮刮油了那么应该如何科学地去油腻呢?01hr清淡食物配粗粮油腻食物食用过多,需要多吃清淡东西心脏决定寿命,立春前后多吃这粗粮,软糯又鲜香,补气血护心脏转眼间立春就要来了,经历了一个寒冬,春天就是万物复苏的时候,在这段时间大地回春,气候也逐步地变得温暖起来。咱们的身体机能也是一样的,在冬天各种脂肪肥肉都藏起来了,为我们保驾护航,抵V观财报调减2019年营收5。27亿元!易事特收监管函中新经纬2月2日电2日,因会计差错问题,深交所向易事特下发监管函。据监管函,易事特于2022年11月15日披露的关于会计差错更正的公告显示,因在对2019年通讯设备及材料业务进行财去年129家首店落地浦东新区,陆家嘴商圈受青睐上海被视为首店经济的标杆城市,2022年在首店经济发展中继续引领全国。来自中商数据的统计显示,2022年上海共计引入1073家首店(含旗舰店概念店),与2021年基本持平,在首店经年出栏从30万头到6100万头,连续盈利13年,牧原是怎么做到的?近期,上市猪企相继披露2022年业绩预告,龙头牧原毫无悬念地以百亿以上的净利润冠绝猪圈。出栏超六千万头,营收首超千元,盈利超120亿牧原预计2022年实现营业收入1220亿1270陈美仪粤港澳三地将迎来合作增长期广东省政协常委广东省工商联副主席澳门中小型企业联合总商会常务副会长陈美仪广东省政协常委广东省工商联副主席澳门中小型企业联合总商会常务副会长陈美仪在2月2日广东省工商联召开的广东省民春节期间全市社会大局稳定治安秩序良好春节期间,全市公安机关在市委市政府和上级公安机关的坚强领导下,秉持群众过节,警察过关的责任担当,强化组织领导严打严防安全监管等各项措施,用心用情做好防风险保安全护稳定各项安保维稳工晚间,传来3个重要消息,A股黑天鹅要来了?解读如下正所谓,希望有多大,失望就有多大!当散户开始得意忘形,不敬畏市场了,就会遭受反围剿。2022年92的股民亏损,人均损失7。6万元,这不就是财富二八定律的真实写照吗?听说,超8成股民骁龙888让台积电赢麻了,还好小米有绝招,小米11系列保卫战骁龙888和骁龙8真是卧龙凤雏,没想到高通连续用了两届三星工艺后,基本把三星的工艺短板暴露的一览无遗,甚至连三星自己都开始嫌弃,去年三星的掌舵人甚至急忙赶赴台积电去参观学习,估摸着从百万级到十万级2023重磅新能源SUV盘点根据乘联会预估分析,2023年新能源乘用车销量有望达到850万辆,渗透率将达36,乘用车市场SUV一直是销量的担当,这部分市场自然是各家争夺的重点,在2023年会有非常多的新能源S40岁苍井空罕见晒全家福,大8岁老公身体素质好,两人还想再生娃春节是我们国家的传统节日,每逢新年之际,不管距离家乡多远,大家都会不远万里回家过年,拍一张全家福更是成了每一个中国家庭的传统。但是,随着中国的影响力不断增强,很多外国人也开始过去春
外媒中国的芯片反击计划开始了进入工业时代后,我国经过自身的努力得到了突飞猛进的发展,尤其是华为等优秀科技企业,在通信芯片设计等领域实现了反超,成为全球行业的领头羊。我国科技领域的快速发展,让老美感到了害怕。美快递业没有双12这是多年来的第一次。2022年双12前夕,某快递公司公关部门员工吴丝按照惯例收集企业内部的双12策略,以备作为整理向媒体宣传的资料。她万万没想到,居然没有人掌握这份资料。不甘心的她实测油耗5。8Lkm,试驾广汽传祺全新GS8双擎新能源加持下,自主中大型SUV品类数量有了几何式增长。但细分市场发展中,真正能做到垂直换代的车型却是凤毛麟角。如果把条件限定在传统能源垂直换代新能源派生车型,恐怕只剩下孤品传祺GS超越现实桎梏,东风日产ePOWER引领混动3。0时代潮流今年新能源市场一个明显的变化是,混动产品混动技术支棱起来了。新能源汽车推动市场化的十余年间,混动一直被作为各种新能源政策路线的基础而存在。在纯电快速发展的大前提下,混动车型的市场格创造发展新机遇数字引擎释放强劲动能一旦发生降雨量水位和渗流渗压的异常参数,我的手机能实时告警,不用抬头看监控大屏,也不用像以前一样每天花两个小时巡查水库。在广州市白云区和龙水库管理所,负责人李树棠谈起智慧水务带来的新疆维吾尔自治区司法厅党委副书记厅长艾尼瓦尔斯依提接受审查调查中央纪委国家监委网站讯据新疆维吾尔自治区纪委监委消息新疆维吾尔自治区司法厅党委副书记厅长艾尼瓦尔斯依提涉嫌严重违纪违法,主动投案,目前正接受新疆维吾尔自治区纪委监委纪律审查和监察调工匠汇2019年上海工匠袁野非遗大师潜伏闵行袁野,1992年大学毕业后被分配到广东的一个博物馆工作,就是在那里,他开始了与紫砂的不解之缘。也正是在那里,他第一次知道,原来经过窑变产生的黑紫砂,不仅是专供皇家的特殊贡品,有着文中国特色成分有哪些?珍珠美白撕开了口子揭秘吧!成分近年来,美白成为功效护肤的重要赛道之一,从美丽修行的数据来看,美白淡斑需求快速走高,从2019年到2021年,关注度飙升9倍,中国的美白淡斑市场从2015年的3515亿元到2021泰政府坚信2023年中国游客将重返泰国日前,泰国国家旅游局局长育他萨透露,近期有调查统计发现2019年累计有超过3990万名游客入境泰国,泰国本土游客出游则超过1。72亿人次,而2022年11月份数据显示,今年泰国本土中国证监会新闻发言人就中美审计监管合作进展情况答记者问证监会网站12月16日消息,中国证监会新闻发言人就中美审计监管合作进展情况答记者问。问当地时间12月15日上午,美国公众公司会计监督委员会(PCAOB)发布报告,确认2022年度可滥用出口管制措施!美国政府将长江存储等36家中国企业列入实体清单财联社12月16日讯(编辑牛占林)美东时间周四,美国政府将长江存储寒武纪上海微电子装备等在内的36家中国科技公司列入了实体清单,以期进一步阻挠和打压中国科技行业的发展。美国商务部将