您的位置:首页 > 编程语言 > Qt开发

QCheckComboBox使用

2013-11-26 02:23 459 查看
class QCheckComboBox : public QComboBox
{
Q_OBJECT

public:
QCheckComboBox(QWidget *parent = 0);
~QCheckComboBox();

void appendItem(const QString &text,bool bChecked);
void hidePopup();
protected:
void mousePressEvent(QMouseEvent *e);

private:
void updateIndexStatus(int index);
signals:
void checkedStateChange(int index, bool bChecked);
};

实现文件:

QCheckComboBox::QCheckComboBox(QWidget *parent)
: QComboBox(parent)
{
setMinimumSize(QSize(100, 27));
setMaximumSize(QSize(16777215, 25));
}

void QCheckComboBox::appendItem( const QString &text,bool bChecked )
{
QIcon icon;
if(bChecked)
icon.addFile(QString::fromUtf8("./Resources/check.png"));
else
icon.addFile(QString::fromUtf8("./Resources/uncheck.png"));
addItem(icon,text,bChecked);
}

void QCheckComboBox::mousePressEvent( QMouseEvent *e )
{
int x= e->pos().x();
int iconWidth= iconSize().width();
if(x<= iconWidth)
{
int index=currentIndex();
updateIndexStatus(index);
}
else
{
QComboBox::mousePressEvent(e);
}
}

void QCheckComboBox::updateIndexStatus( int index )
{ ///previous state
bool bChecked= itemData(index).toBool();
if(bChecked) ///先前已经是选中状态
{
if(index==0) ///全选
{
for(int i=0; i<this->count(); i++)
{
setItemIcon(i,QIcon(QString::fromUtf8("./Resources/uncheck.png")));
setItemData(i,!bChecked);
}
}
else setItemIcon(index, QIcon(QString::fromUtf8("./Resources/uncheck.png")));
}
else
{
if(index==0)
{
for(int i=0; i<this->count(); i++)
{
setItemIcon(i,QIcon(QString::fromUtf8("./Resources/check.png")));
setItemData(i,!bChecked);
}
}
else setItemIcon(index, QIcon(QString::fromUtf8("./Resources/check.png")));
}
setItemData(index,!bChecked); //previous state取反

int i;
for(i=1; i<this->count(); i++)
{
if(itemData(i).toBool()==false)
{
setItemIcon(0, QIcon(QString::fromUtf8("./Resources/uncheck.png")));
setItemData(0,false);
break;
}
}
if(i==this->count())
{
setItemIcon(0, QIcon(QString::fromUtf8("./Resources/check.png")));
setItemData(0,true);
}
emit checkedStateChange(index,!bChecked);
}

void QCheckComboBox::hidePopup()
{
int iconW = iconSize().width();
int x = QCursor::pos().x() - mapToGlobal(geometry().topLeft()).x() + geometry().x();
int index = view()->selectionModel()->currentIndex().row();
if (x >= 0 && x <= iconW)
{
updateIndexStatus(index);
}
else
{
QComboBox::hidePopup();
}
}
示例如下:
void CCTest::checkChaged( int index,bool bChecked )
{
if(bChecked)
qDebug()<<index<<" is checked";
else
qDebug()<<index<<" is unchecked";
QString strout;
for(int i=0; i<ccbox->count(); i++)
{
if(ccbox->itemData(i).toBool()==true)
strout+=ccbox->itemText(i);
}
qDebug()<<strout;
}


转:http://blog.csdn.net/rabinsong/article/details/9007283
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  QComboBox Qt