上一篇文章Qt之QComboBox定制讲到了qt实现自定义的下拉框,该篇文章主要实现了列表式的下拉框,这一节我还将继续讲解QComboBox的定制,而这一节我将会讲述更高级的用法,不仅仅是下拉列表框,而可以实现下拉框为表格,原理其实上一篇文章中的列表框类似,不过在这篇文章我将会重点讲述一下不同的地方,好了,下边我先截取一下demo中的运行效果图,如图1所示,效果并不是那么美观,不过确实有很大的用处。

图1 表格下拉框

看了上图中的展示,是不是觉得很眼熟,是的,同学你说对了,其实这个界面时仿照铁道部的地区选组框做出来的,只不过是效果上有所差异,而功能上基本差不多,上图中的标题栏我是为了实现透明的表头而故意设置透明的,设置透明也是我后边重点要说的,怎么实现下拉框的背景色透明。

在文章的讲解开始前,我先截取下其他两个下拉框的截取,让有所期待的同学一睹为快。说实话,现在的下拉框并不是那么好看,不过用好了qss,这个就不是那么重要了,重要的是下拉框的交互功能,如图2是下拉框列表框,如图3是下拉框表格,不同于图1,图3是不支持根据表头切换内容的下拉框表格。

aaarticlea/png;base64,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" alt="" />

图2 下拉框列表

aaarticlea/png;base64,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" alt="" />

图3 下拉框表格

首先声明一下,在看这篇文章的时候我默认同学们已经看过Qt之QComboBox定制这篇文章,我的代码都是在这个demo的基础上重构出来的,如果有什么疑问可以去这篇文章中看看,或者直接私信我。

说起这个demo,我主要是按照两个路线来实现下拉框界面定制,列表和表格,所以我在实现的时候会分出这两个类来进行封装,然后在把他们的一些公有的操作提取出来,作为一层父类,也就是上文中所提到的博客中的combobox类。

接下来就是代码时刻,demo我会在文章最后给出下载链接,因此文章中我只贴出关键的代码段,

1、首先先来理解下文章中关键的类,理解了这几个类,这个demo的骨架就清楚了

CComboBox:下拉框父类,实现了大多数的数据添加接口

CListPopupComboBox:下拉框列表,如图2

CCheckBoxHeaderView:水平表头,主要是自绘表头

CTablePopupComboBox:下拉框表格,如图3

CTableRowHeaderView:列表头

CCityComboBox:城市选择下拉框,如图1

2、demo中的注释也是主要集中在接口中,不过在这里我还是要在不厌其烦的说一下接口相关的东西,毕竟接口就像是人的眼睛,接口弄明白了才能正确使用。

 class CComboBox : public QWidget
{
public:
CComboBox(CustomPopupComboBox::ItemType type, QWidget * parent = nullptr);
~CComboBox(){} public:
//设置分隔符 默认为'|'
void SetSeparatorSymbol(char symbol);
char GetSeparatorSymbol() const { return m_SeparatorSymbol; } //新增数据
void AddText(const QString & text);
void AddTexts(const QVector<QString> & items); //设置下拉框属性
void SetItemWidth(int width);
void SetItemHeight(int height); //设置最多可见条目数
void SetMaxVisibleCount(int count); //设置下拉框中项模式
void SetItemType(CustomPopupComboBox::ItemType type){ m_Type = type; }
CustomPopupComboBox::ItemType GetItemType() const { return m_Type; } protected:
virtual bool eventFilter(QObject *, QEvent *) Q_DECL_OVERRIDE; protected:
virtual void AddItem(const QString & text) = ;
virtual void ResetItemWidth(int width) = ;
virtual void ResetItemHeight(int height) = ; protected:
QWidget * NewItem(const QString & text); protected:
CustomPopupComboBox::ItemType m_Type = CustomPopupComboBox::LabelItem;
char m_SeparatorSymbol = '|';//表格选择项分隔符
int m_ItemCount = ;//表格总的项数
QString m_CurrentMemory;//当前选择字符串
QComboBox * m_ComboBox = nullptr;
QWidget * m_BottomWidget = nullptr;
QWidget * m_PopupWidget = nullptr; //定制项信息
int m_ItemWidth = ;
int m_ItemHeight = ;//需要和css文件中的QComboBox QAbstractItemView::item{height:45px;}对应 private:
void InitializeUI();
};

上述代码中有几个保护的纯虚函数,这几个接口主要是在具体的下拉框类中实现,而该接口会在父类中被调用,其他public接口都是含有注释的,直接看代码应该也能看懂。

3、列表下拉框

 ///    说明:combobox定制  下拉框为单列数据,支持文本、单选和复选
class CListPopupComboBox : public CComboBox
{
Q_OBJECT public:
CListPopupComboBox(CustomPopupComboBox::ItemType type = CustomPopupComboBox::RadioItem, QWidget * parent = nullptr);
~CListPopupComboBox(); protected:
virtual bool eventFilter(QObject *, QEvent *) Q_DECL_OVERRIDE; //新增数据 CComboBox
virtual void AddItem(const QString & text) Q_DECL_OVERRIDE;
virtual void ResetItemWidth(int width) Q_DECL_OVERRIDE;
virtual void ResetItemHeight(int height) Q_DECL_OVERRIDE; private:
virtual void ConstructView();//列表定制
};

实现了CComboBox类中的3个纯虚接口,主要是重置下拉框项的高度和宽度,还有增加项等接口。列表框增加项代码如下:

 void CListPopupComboBox::AddItem(const QString & text)
{
if (QListWidget * listWidget = dynamic_cast<QListWidget *>(m_PopupWidget))
{
QWidget * itemWidget = NewItem(text);
//itemWidget->setStyleSheet(QString("QCheckBox {background-color:lightgray;}"
// "QCheckBox:checked{background-color:white;}")); itemWidget->setFixedSize(m_ItemWidth, m_ItemHeight); int pos = listWidget->count() - < ? : listWidget->count() - ;
listWidget->insertItem(pos, new QListWidgetItem());
listWidget->setItemWidget(listWidget->item(pos), itemWidget);
}
}

4、表格行表头定制

 ///    说明:table列表头定制
class CCheckBoxHeaderView : public QHeaderView
{
Q_OBJECT
public:
CCheckBoxHeaderView(int checkColumnIndex,
Qt::Orientation orientation,
QWidget * parent = ) :
QHeaderView(orientation, parent)
{
m_checkColIdx = checkColumnIndex;
} public:
void UpdateSelectColumn(int); signals:
void SectionClicked(int); protected:
virtual void paintSection(QPainter * painter, const QRect &rect, int logicalIndex) const;
virtual void mousePressEvent(QMouseEvent *) Q_DECL_OVERRIDE; private:
int m_checkColIdx;
};

主要实现了表格行表头自绘制,绘制代码在paintSection接口中实现,具体绘制方式如下:

 void CCheckBoxHeaderView::paintSection(QPainter * painter, const QRect &rect, int logicalIndex) const
{
QRect r = rect;
r.setTop(r.top() + );
r.setLeft(r.left() - );
painter->fillRect(r, Qt::white); if (logicalIndex == )
{
r.setTop(r.top() - );
r.setHeight();
painter->drawPixmap(rect, QPixmap(QStringLiteral(":/combobox/Resources/bg.png")));
} QString text = model()->headerData(logicalIndex, this->orientation(),
Qt::DisplayRole).toString(); painter->setPen(QColor(, , ));
painter->drawLine(rect.bottomLeft(), rect.bottomRight()); painter->setPen(QPen(QColor(Qt::red), ));
if (logicalIndex == m_checkColIdx)
{ QLine line(rect.bottomLeft() + QPoint(rect.width() / , ), rect.bottomRight() - QPoint(rect.width() / , ));
painter->drawLine(line); QFont font = painter->font();
font.setBold(true);
painter->setFont(font);
} painter->drawText(rect, Qt::AlignCenter, text);
}

5、表格下拉框

 class CTablePopupComboBox : public CComboBox
{
Q_OBJECT public:
CTablePopupComboBox(CustomPopupComboBox::ItemType type = CustomPopupComboBox::CheckBoxItem, QWidget * parent = );
~CTablePopupComboBox(); public: //设置列数
void SetTableColumn(int column);
void SetHorizontalHeaderLabels(const QStringList & headerNames); //设置下拉框属性
void SetItemWidth(int width);
void SetItemHeight(int height); //设置表头是否可见
void SetHorizontalHeaderVisible(bool visible); void CompletedData(); protected:
virtual bool eventFilter(QObject *, QEvent *) Q_DECL_OVERRIDE; virtual void AddItem(const QString & text) Q_DECL_OVERRIDE;//新增数据
virtual void ResetItemWidth(int width) Q_DECL_OVERRIDE;
virtual void ResetItemHeight(int height) Q_DECL_OVERRIDE;
virtual void CompleteItems();//补齐没有填充完的行 防止combobox的view接手鼠标事件 virtual void ColumnHeaderClicked(int column);//列表头被点击处理 private slots:
void HeaderClicked(int index); private:
virtual void ConstructView();//表格定制 private:
//定制项信息 //表格
int m_TableColumnCount = ;
};

表格下拉框比列表下拉框复杂,它除了实现列表下拉框的接口外还实现了额外的接口,比如支持列表头和行表头的显示,并支持滚动条的显示等,这个表格下拉框实现起来没有那么完善,其中不乏有大量的bug,如果有同学发现了什么解决不了的问题可以私信我,或许这个bug我已经在项目中修正了,但是demo就没有时间修改。

6、行表头定制

 ///    说明:table列表头定制
class CTableRowHeaderView : public QHeaderView
{
Q_OBJECT
public:
CTableRowHeaderView(QWidget * parent = ) :
QHeaderView(Qt::Vertical, parent)
{
} protected:
virtual void paintSection(QPainter * painter, const QRect &rect, int logicalIndex) const; private:
};

7、城市列表下拉框

 ///    说明:城市选择下拉框 支持行表头显示  不支持滚动条显示
class CCityComboBox : public CTablePopupComboBox
{
Q_OBJECT public:
CCityComboBox(QWidget *parent);
~CCityComboBox(); public:
void SetVerticalHeaderLabels(const QStringList & headerNames);//设置表头列显示数据 不建议主动设置
void SetVerticalHeaderWidth(int width);//设置表头列宽度
void SetVerticalHeaderVisible(bool visible);//设置表头列是否可见 ///***********************************/// /// 说明:设置当前默认添加城市分组 配合AddText(AddTexts)一起使用 单次添加的数据 最后必须调用CompletedData接口
///***********************************///
void SetCurrentCityKey(char key){ m_CurrentCityKey = QChar(key).toLower().toLatin1(); }
void CompletedData(); ///***********************************/// /// 说明:设置当前城市分组
///***********************************///
void SetCistyMaps(const std::map < char, std::list<QString> > & citys); protected:
virtual void AddItem(const QString & text);
virtual void ColumnHeaderClicked(int column); private slots: private:
void InitializeUI();
void FillData();//填充数据
int ResetTableData(int column);//根据点击列重置表格数据 private:
bool m_NeedFixedHeight = true;
char m_CurrentCityKey = 'a';
int m_CurrentDisplayColumnOrder = ;
int m_VerticalHeaderWidth = ;
QStringList m_VerticalHeaderName;
std::map< char, std::list<QString> > m_CitysMap;//按字母存储的城市列表
std::map < int, std::list<int> > m_RowsMap;//以列为键存储所在行
};

本篇文章的核心主要是想讲解这个类,该类可以实现上述列表下拉框和表格下拉框的功能,只需要调用相应的接口就可以,比如说列表下拉框,那么我只需要调用隐藏行和列表头,并把列设置为一列即可。

这个城市列表框其实也是在Qt之QComboBox定制文章中重构过来的,虽然接口类似,但是内部的实现细节有了不小的变化,就比如这个表格下拉框在列表头点击切换功能实现时,我改变了数据的存储模式,以前都是把数据删除重新添加,但是现在我是把所有数据都添加在表格中,而根据所需要显示的行进行show,而其他行直接hide,这样不仅实现起来方便而且不需要维护大量的缓存数据。

在这篇文章最开始的效果展示图中就能看到,下拉框有一部分是透明的了,这个其实也是我想实现的功能的一部分,主要是想实现一个带有小三角的下拉框,按照上述的方式应该也是能够实现,关于这个下拉框北京透明我也是搞了好久才搞明白,其实只要简单的几行代码就可以,代码如下:

 if (QWidget * parent = m_ComboBox->view()->parentWidget())
{
// parent->installEventFilter(this);
parent->setAttribute(Qt::WA_TranslucentBackground);
parent->setWindowFlags(Qt::Popup | Qt::FramelessWindowHint);
}

只需要获取下拉框的顶层父类,然后设置其属性并设置其窗口风格即可,可是就这么几句话,不设置根本不能够实现背景色透明。所以看到这个信息的同学真是幸福。

城市表格下拉框的使用方式也比较简单,在添使用AddText加完数据之后需要调用CompletedData接口类告诉该类数据添加完毕;如果调用SetCistyMaps接口设置数据,则不需要,demo中使用方式如下:

 CCityComboBox w3(&p);

     w3.SetItemType(CustomPopupComboBox::LabelItem);
w3.SetHorizontalHeaderLabels(QStringList() << QStringLiteral("ABCDEF") << QStringLiteral("GHIJ")
<< QStringLiteral("KLMN")
<< QStringLiteral("PQRSTUVM")
<< QStringLiteral("XYZ"));
w3.SetVerticalHeaderLabels(QStringList() << QStringLiteral("A") << QStringLiteral("B")
<< QStringLiteral("C")
<< QStringLiteral("D")
<< QStringLiteral("E")); w3.SetHorizontalHeaderVisible(true);
w3.SetVerticalHeaderVisible(true);
w3.setFixedSize(, );
w3.AddText(QStringLiteral("a"));
w3.AddText(QStringLiteral("a"));
w3.AddText(QStringLiteral("a"));
w3.AddText(QStringLiteral("a"));
w3.AddText(QStringLiteral("a"));
w3.AddText(QStringLiteral("a"));
w3.AddText(QStringLiteral("a"));
w3.AddText(QStringLiteral("a"));
w3.AddText(QStringLiteral("a"));
w3.AddText(QStringLiteral("a"));
w3.AddText(QStringLiteral("a"));
w3.AddText(QStringLiteral("a"));
w3.AddText(QStringLiteral("a")); w3.SetCurrentCityKey('B');
w3.AddText(QStringLiteral("b"));
w3.AddText(QStringLiteral("b"));
w3.AddText(QStringLiteral("b"));
w3.AddText(QStringLiteral("b"));
w3.AddText(QStringLiteral("b"));
w3.SetCurrentCityKey('C');
w3.AddText(QStringLiteral("cC"));
w3.AddText(QStringLiteral("cC"));
w3.AddText(QStringLiteral("cC"));
w3.AddText(QStringLiteral("cC"));
w3.AddText(QStringLiteral("cC"));
w3.AddText(QStringLiteral("cC"));
w3.AddText(QStringLiteral("cC"));
w3.SetCurrentCityKey('M');
w3.AddText(QStringLiteral("m"));
w3.AddText(QStringLiteral("m"));
w3.AddText(QStringLiteral("m"));
w3.AddText(QStringLiteral("m"));
w3.AddText(QStringLiteral("m"));
w3.CompletedData();

本篇文章我只讲述了实现这样一个下拉框所需要的接口文件,而具体的实现我没有拉出来将,因为我觉着这个和上一篇文章中的实现类似,只是在接口上有比较大的重构。在写这篇文章的时候其实我就有一个想法,我应该还会写关于下拉框定制的第三篇文章,而这第三篇文章主要讲的还是怎么实现一个下拉框,但是走的完全是和现在不一样的路线。因为最近项目真的非常的紧张,根本没有时间去写和测试相关的demo,不过后边如果有时间我会尽快补上。

关于全新的下拉框定制,我的想法是完全定制一个下拉框,而不是重写QComboBox,这样的话可以省去很多的麻烦,比如:下拉框的大小,下拉框的视图位置等问题,说到这儿,我突然想起来这个demo的一个bug,那就是在表格下拉框出现下拉框滚动条的时候,如果在滚动了垂直滚动条之后隐藏下拉框,那么下次展示下拉框窗口时,视图会显示不正确,这个问题我自己已经解决了,但是没有在demo体现,解决办法是:在隐藏下拉框窗口时,把其视图滚动到顶端,实现代码如下:

 bool CTablePopupComboBox::eventFilter(QObject * watched, QEvent * event)
{
if (m_BottomWidget && m_BottomWidget == watched)
{
if (QMouseEvent * mouseEvent = static_cast<QMouseEvent *>(event))
{
if (mouseEvent->type() == QEvent::MouseButtonPress
|| mouseEvent->type() == QEvent::MouseButtonRelease)
{
return true;
}
}
}
else if (watched == m_ComboBox->view()->parentWidget()
&& event->type() == QEvent::Hide)
{
if (QTableWidget * tableWidget = dynamic_cast<QTableWidget *>(m_PopupWidget))
{
tableWidget->scrollToTop();
}
} return QWidget::eventFilter(watched, event);
}

注意:这个demo比较粗糙,如果有问题的同学可以私聊我,不管是建议还是问题我都会认真的回答

demo下载链接:http://download.csdn.net/detail/qq_30392343/9608629

如果您觉得文章不错,不妨给个打赏,写作不易,感谢各位的支持。您的支持是我最大的动力,谢谢!!! 

 

很重要--转载声明

  1. 本站文章无特别说明,皆为原创,版权所有,转载时请用链接的方式,给出原文出处。同时写上原作者:朝十晚八 or Twowords
  2. 如要转载,请原文转载,如在转载时修改本文,请事先告知,谢绝在转载时通过修改本文达到有利于转载者的目的。

Qt之QComboBox定制(二)的更多相关文章

  1. Qt之QComboBox定制

    说起下拉框,想必大家都比较熟悉,在我们注册一些网站的时候,会出现大量的地区数据供我们选择,这个时候出现的就是下拉框列表,再比如字体选择的时候也是使用的下拉框,如图1所示.下拉框到处可见,作为一个图形库 ...

  2. 定制二选一按钮SwitchButton

    定制二选一按钮SwitchButton 效果: 源码: SwitchButton.h 与 SwitchButton.m // // SwitchButton.h // KongJian // // C ...

  3. Qt DLL总结【二】-创建及调用QT的 DLL(三篇)good

    目录 Qt DLL总结[一]-链接库预备知识 Qt DLL总结[二]-创建及调用QT的 DLL Qt DLL总结[三]-VS2008+Qt 使用QPluginLoader访问DLL 开发环境:VS20 ...

  4. Qt之QComboBox(基本应用、代理设置)(转)

    QComboBox下拉列表比较常用,用户可以通过选择不同的选项来实现不同的操作,如何实现自己的下拉列表呢? 很多人在问QComboBox如何设置选项的高度.代理等一些问题!今天就在此分享一下自己的一些 ...

  5. 通过Qt样式表定制程序外观(比较通俗易懂)

    1. 何为Qt样式表[喝小酒的网摘]http://blog.hehehehehe.cn/a/10270.htm2. 样式表语法基础3. 方箱模型4. 前景与背景5. 创建可缩放样式6. 控制大小7. ...

  6. Qt之QComboBox(基本应用、代理设置)

    QComboBox下来列表比较常用,用户可以通过选择不同的选项来实现不同的操作,如何实现自己的下拉列表呢? 很多人在问QComboBox如何设置选项的高度.代理等一些问题!今天就在此分享一下自己的一些 ...

  7. Qt之自定义托盘(二)

    上一篇文章讲述了自定义Qt托盘,不过不是使用QSystemTrayIcon这个类,而是我们自己完全自定义的一个类,我们只需要处理这个类的鼠标hover.鼠标左键点击.鼠标右键点击和鼠标左键双击,就可以 ...

  8. QT开发(十二)——QT事件处理机制

    一.QT事件简介 QT程序是事件驱动的, 程序的每个动作都是由内部某个事件所触发.QT事件的发生和处理成为程序运行的主线,存在于程序整个生命周期. 常见的QT事件类型如下: 键盘事件: 按键按下和松开 ...

  9. Qt样式表之二:QSS语法及常用样式

    一.简述 Qt样式表(以下统称QSS)的术语和语法规则几乎和CSS相同.如果你熟悉CSS,可以快速浏览以下内容.不熟悉的话可以先去W3School - CSS或者本人的CSS博客随笔简单了解一下. 在 ...

随机推荐

  1. java TripleDES加密

    package com.zhx.base.util; import org.apache.commons.codec.binary.Base64; import javax.crypto.Cipher ...

  2. java基础之IO流及递归理解

    一.IO流(简单理解是input/output流,数据流内存到磁盘或者从磁盘到内存等) 二.File类(就是操作文件和文件夹的) 1.FIleFile类构造方法 注意:通过构造方法创建的file对象是 ...

  3. FoxMail邮件设置

    最近部门变动,要求所有的沟通及交流都需要用企业邮箱,对于一般不喜欢看邮箱的我,经常会错过很多邮件.为了统一接收企业邮件及个人邮件,开始使用Foxmail(以前不喜欢整这些东西).下面分享一下FoxMa ...

  4. [SCOI2015]小凸玩矩阵

    Description: 给你一个n*m的网格,每个格子有一个数字,每行每列只能选一个数字,问所选数字中第k大的数字的最小值是多少 Hint: \(n \le 250\) Solution: 显然是二 ...

  5. python 多线程 及多线程通信,互斥锁,线程池

    1.简单的多线程例子 import threading,timedef b_fun(i): print "____________b_fun start" time.sleep(7 ...

  6. On the Optimal Approach of Survivable Virtual Network Embedding in Virtualized SDN

    Introduction and related work 云数据中心对于虚拟技术是理想的创新地方. 可生存性虚拟网络映射(surviavable virtual network embedding ...

  7. JVM虚拟机个人理解

    针对于java1.8版本,JVM的系统架构 类加载机制: 堆内存结构图: 面试题:一个对象从创建到销毁经历了什么? 1.new一个对象时,在堆内存中开辟一块空间. 2.给开辟的空间分配一个地址. 3. ...

  8. CDI Features

    概述 如果说EJB,JPA是之前JEE(JEE5及JEE5之前)中里程碑式的规范,那么在JEE6,JEE7中CDI可以与之媲美,CDI(Contexts and Dependency Injectio ...

  9. java.lang.ClassCastException: net.sf.json.JSONNull cannot be cast to net.sf.json.JSONObject的解决方法

    报错情况已经说明了,在百度查了好几个解决方法,这里总结一下: 首先:加一个判断是否为空,再做操作 // 得到json串 String jsonString = UtilPOSTGET.UPost(FO ...

  10. 2017 ES GZ Meetup分享:Data Warehouse with ElasticSearch in Datastory

    以下是我在2017 ES 广州 meetup的分享 ppt:https://elasticsearch.cn/slides/11#page=22 摘要 ES最多使用的场景是搜索和日志分析,然而ES强大 ...