您的位置:首页 > 其它

QComboBox下拉列表添加复选框及消息处理 .

2013-07-04 20:44 274 查看
来源: /article/8081454.html

转载请务必注明出处及原始链接,谢谢!

要在QComboBox下拉列表项中添加复选框,并进行消息处理,在网上搜索了很久没有找到太多有用的信息和实际的例子,

但从中还是找到了一些提示性的资料,根据这些简短的介绍,最终实现了这个功能。

QComboBox有一个setView的方法,因此,可以自定义的一个视图类,将复选框在视图中实现,本例自定义视图类继承于QListWidget,

因为在该视图类中,有一个setItemWidget方法,可以直接将QCheckBox附加在QListWidgetItem项上。 具体看下面得的示例:

//QCombobox下拉列表添加QCheckBox复选框

class MyListView : public QListWidget

{

Q_OBJECT//自定义信号槽时需加上该宏,否则链接信号槽将会失败



public:

/*

columnlabelsQCheckBox名称

dataQListWidgetItem的用户自定义数据

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的TextEdit设置为可编辑,以便选择结果的显示
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: