上一篇文章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. maya cmds pymel 选择 uv area(uv 面积) 为0 的面

    maya cmds pymel 选择 uv area(uv 面积) 为0 的面 cmds.selectType( pf=True ) cmds.polySelectConstraint( m=3, t ...

  2. linux 启动springboot项目

    1.启动 nohup java -jar train-manager.jar --spring.profiles.active=test > out.log & 2.查看进程 ps -e ...

  3. 如何让Qt程序在运行时获取UAC权限

    在pro文件中加入以下语句: QMAKE_LFLAGS += /MANIFESTUAC:\"level=\'requireAdministrator\' uiAccess=\'false\' ...

  4. selenium 不同版本Driver

    selenium进行UI自动化测试需要Driver支持,不同的浏览器需要不同的Driver,之前使用的Driver可以正常运行,但是总会报一些莫名的问题,经过查找,原来IE的Driver需要与sele ...

  5. 第k个素因子只有3 5 7 的数

    题目描述 有一些数的素因子只有3.5.7,请设计一个算法,找出其中的第k个数. 给定一个数int k,请返回第k个数.保证k小于等于100. 测试样例: 3 返回:7 int findKth(int ...

  6. 编程菜鸟的日记-初学尝试编程-C++ Primer Plus 第6章编程练习5

    #include <iostream> using namespace std; const double N1=35000; const int N2=15000; const int ...

  7. 限制输入字数JS

    <tr> <th><b>说明内容:</b><span id="content">(500字以内)</span> ...

  8. textarea--去掉空格的办法

    我在初次用到textarea多行文本框时,遇到的问题是:默认出现了两行空格,如图: 代码是(错误的写法): 最后才发现,原来是: textarea标签是需要写在同一行,不能换行,正确的写法:

  9. Ubuntu下安装Pycharm出现unsupported major.minor version 52.0

    (一)原因 Ubuntu下pycharm安装:https://jingyan.baidu.com/article/60ccbceb4e3b0e64cab19733.html pycharm激活:htt ...

  10. SpringAop注解实现日志的存储

    一.介绍 1.AOP的作用 在OOP中,正是这种分散在各处且与对象核心功能无关的代码(横切代码)的存在,使得模块复用难度增加.AOP则将封装好的对象剖开,找出其中对多个对象产生影响的公共行为,并将其封 ...