~~~~我的生活,我的点点滴滴!!
很多时候界面的空间是有限的,如果有很多选择框要放怎么办?下拉框怎么样?--------搜了一搜,有人这样干过,特此学习一下,记录在此!
看看QComboBox为了们提供了哪些有用的接口。
void QComboBox::addItem(const QIcon & icon, const QString & text, const QVariant & userData = QVariant()) Adds an item to the combobox with the given icon and text, and containing the specified userData (stored in the Qt::UserRole). The item is appended to the list of existing items.第一个参数为图片, 第二个为内容,第三个为我们自定义数据存储。
如果可以利用图片的切换来达到效果,也就是准备两张图片,选中与未选中(图片我直接截取Qt-designer里面的复选框),我们需要注意的点:
1、鼠标点击复选框图片时,判断点击的是哪一项
2、取出那一项的userData判断当前是什么状态
3、根据状态更新图片
看下面代码,代码有注释
class CCheckCombox : public QComboBox { Q_OBJECT public: explicit CCheckCombox(QWidget *parent = 0); //添加下拉框内容 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: };上面为头文件里面的内容,看起来也没有想象中的那么多,ps----本人使用的是Qt5.3.1
源文件:
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 >= 0 && x <= iconWidth ) { updateIndexStatus(index); } else { QComboBox::hidePopup(); } }上面基本上就实现了所需功能,测试样例
ui->comboBox->appendItem("1111", false); ui->comboBox->appendItem("2222", false); ui->comboBox->appendItem("3333", true); ui->comboBox->appendItem("4444", true); ui->comboBox->appendItem("5555", false); ui->comboBox->appendItem("6666", true);
附Demo 下载地址:http://download.csdn.net/detail/ac_huang/7582797