要在QComboBox下拉列表項中添加復選框,並進行消息處理,在網上搜索了很久沒有找到太多有用的信息和實際的例子,但從中還是找到了一些提示性的資料,根據這些簡短的介紹,最終實現了這個功能。
QComboBox有一個setView的方法,因此,可以自定義的一個視圖類,將復選框在視圖中實現,本例自定義視圖類繼承於QListWidget,因為在該視圖類中,有一個setItemWidget方法,可以直接將QCheckBox附加在QListWidgetItem項上。 具體看下面得的示例:
//QCombobox下拉列表添加QCheckBox復選框
class MyListView : public QListWidget
{
Q_OBJECT //自定義信號槽時需加上該宏,否則鏈接信號槽將會失敗
public:
/*
columnlabels QCheckBox名稱
data QListWidgetItem的用戶自定義數據
cmb 添加列表項的QComboBox,此處主要用於及時的將用戶選擇的結果顯示出來
*/
MyListView(QWidget* parent=0, QStringList *columnlabels=NULL, QList<QVariant> *data=NULL, QComboBox* cmb=NULL)
{
setViewMode(QListWidget::ListMode);
setSelectionMode(QAbstractItemView::SingleSelection);
m_cmbox = cmb;
for( int i=0; i<columnlabels->size(); i++ )
{
m_bchecked.append(false);
m_data.append(data->at(i));
QListWidgetItem *item = new QListWidgetItem();
item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsUserCheckable |Qt::ItemIsEnabled);
item->setData(Qt::UserRole+1, data->at(i));
insertItem(model()->rowCount(), item);
QCheckBox* box = new QCheckBox(tr(columnlabels->at(i).toAscii().data()));
setItemWidget(item, box);
m_checklist.append(box);
m_fslist.append(columnlabels->at(i));
//鏈接復選狀態改變信號槽
int val = QObject::connect(box, SIGNAL(stateChanged(int)), this, SLOT(set_select_item(int)));
qDebug() << tr("鏈接checkbox消息:%1").arg(val);
}
}
public:
//返回用戶選擇項的用戶自定義數據
void get_select_data(QList<QVariant> &data)
{
for( int i=0; i<m_bchecked.size(); i++)
{
if( m_bchecked.at(i)== true)
data.append( m_data.at(i) );
}
}
private slots:
//QCheckBox復選消息處理
void set_select_item(int state)
{
QCheckBox* box = qobject_cast<QCheckBox*>(sender());
for( int off = 0;off<m_checklist.size(); off++)
{
if( box == m_checklist.at(off) )
{
m_bchecked[off] = (box->checkState() == Qt::Checked) ? true : false;
break;
}
}
QString strfs;
for( int i=0; i<m_bchecked.size(); i++)
{
if( m_bchecked.at(i)== true)
{
strfs += m_fslist.at(i);
strfs += ",";
}
}
qDebug() << tr(strfs.toAscii().data());
m_cmbox->setEditText( strfs );
}
private:
QComboBox *m_cmbox;
QList<bool> m_bchecked;
QList<QVariant> m_data;
QList<QCheckBox*> m_checklist;
QList<QString> m_fslist;
};
有了上述自定義視圖后,接下來,就是需要QComboBox的setView,但根據Qt的幫助問題提示,在setView之前,
需要先將QComboBox的數據視圖Model指向該View的Model,具體看代碼。
QComboBox *cmb = new QComboBox();
MyListView *view = new MyListView(this, &strfs, &fstype, cmb);
cmb->setModel( view->model() ); //設置Model
cmb->setView( view); //設置視圖
cmb->setEditable(true); //此處需要將QComboBox(來源:CSDN)
http://blog.csdn.net/styyzxjq2009/article/details/7975262