QCheckComboBox使用

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.youkuaiyun.com/rabinsong/article/details/9007283

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值