最近研究了好多东西,前两天突然想做一个具有复选功能的下拉列表框。然后在网上“学习”了很久之后,终于发现了一个可以用的,特地发出来记录一下。
一、第一步肯定是先创建一个PROJECT了,这里对工 PROJECT的类型没有太大的要求,QMainWindow、QWidget、QDialog都是没关系的。
二、这里需要添加我们的代码了。这里我们用CCheckCombox来命名把,添加新文件:CCheckCombox.h和对应的CCheckCombox.cpp。
CCheckCombox.h的文件代码如下:
#ifndef CCHECKCOMBOX_H
#define CCHECKCOMBOX_H #include <QComboBox>
#include <QMouseEvent>
#include <QAbstractItemView>
#include <QItemSelectionModel> class CCheckCombox : public QComboBox
{
Q_OBJECT
public:
explicit CCheckCombox(QWidget *parent = ); //添加下拉框内容
void appendItem(const QString &text, bool bChecked); //QComboBox的虚函数用来隐藏列表框,当单击是复选框时不让隐藏,用来改变状态
void hidePopup(); protected:
void mousePressEvent(QMouseEvent *event); private:
//更新更改项的状态
void updateIndexStatus(int index); signals:
//状态改变后发送一个信号,告诉外界。
void checkedStateChange(int index, bool bChecked); public slots: }; #endif // CCHECKCOMBOX_H
然后是我们的CCheckCom.cpp的代码:
#include "ccheckcombox.h" CCheckCombox::CCheckCombox(QWidget *parent) :
QComboBox(parent)
{ } void CCheckCombox::appendItem(const QString &text, bool bChecked)
{
QIcon icon;
if( bChecked )
{
icon.addFile(":/Image/check.png");
}
else
{
icon.addFile(":/Image/uncheck.png");
} addItem(icon, text, bChecked);
} void CCheckCombox::updateIndexStatus(int index)
{
bool bChecked = this->itemData(index).toBool(); if( bChecked )
{
this->setItemIcon(index, QIcon(":/Image/uncheck.png"));
}
else
{
this->setItemIcon(index, QIcon(":/Image/check.png"));
} setItemData(index, !bChecked); emit checkedStateChange(index, !bChecked);
} void CCheckCombox::mousePressEvent(QMouseEvent *event)
{
int x = event->pos().x(); int iconWidth = this->iconSize().width(); if( x <= iconWidth )
{
int index = this->currentIndex(); updateIndexStatus(index);
}
else
{
QComboBox::mousePressEvent(event);
}
} void CCheckCombox::hidePopup()
{
int iconWidth = this->iconSize().width(); int x = QCursor::pos().x() - mapToGlobal(geometry().topLeft()).x() + geometry().x(); int index = view()->selectionModel()->currentIndex().row(); if( x >= && x <= iconWidth )
{
updateIndexStatus(index);
}
else
{
QComboBox::hidePopup();
}
}
值得注意的是,这里我们的选中和为选种采用了图片来确定。所以我们还需要通过截图来获得一个对勾选中和一个为选中图片。
然后我们的这个时候需要从ui中托一个Combobox控件到窗口上。
之后我们需要把这个Combobox控件提升为一个CCheckCombox的类:
右键单击控件选择提升为,之后填入相应的信息。
第一步输入类名称,然后点击添加,第三步需要点击添加后的类名称选中。然后点击提升类。
到这里,我们的CCheckCombox已经成功提升了,接下来就是添加里边的item了。
我这里构造了一个ADD方法来添加测试item,大家使用的时候直接调用appendItem()方法就可以直接添加,第一个参数为text,第二个参数为默认选中状态。
然后我们测试一下,看行不行。。。。。。
item是成功添加了,但是还没有复选框,原因在于,我们刚才说到,这里的选中状态是由图片来控制的,所以我们要带入资源文件。
添加成功过之后我们再来测试一下。
好的,到这里,我们的控件已经可以使用了,后期我们如果要取出这些选中的内容的话,只需要使用itemData(i).toBool()方法来判断就行了。
下面是本文用到的代码相关文件。CCheckCombox的两个文件来自网络,不记得是哪位大佬发的了,在这里特别感谢。
下载地址:https://git.coding.net/HULANG-BTB/QT_CCheckCombox.git