您的位置:首页 > 其它

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

2012-09-13 15:33 323 查看
要在QComboBox下拉列表项中添加复选框,并进行消息处理,在网上搜索了很久没有找到太多有用的信息和实际的例子,但从中还是找到了一些提示性的资料,根据这些简短的介绍,最终实现了这个功能。

QComboBox有一个setView的方法,因此,可以自定义的一个视图类,将复选框在视图中实现,本例自定义视图类继承于QListWidget,因为在该视图类中,有一个setItemWidget方法,可以直接将QCheckBox附加在QListWidgetItem项上。具体看下面得的示例:

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

classMyListView:publicQListWidget

{

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(inti=0;i<columnlabels->size();i++)

{

m_bchecked.append(false);

m_data.append(data->at(i));


QListWidgetItem*item=newQListWidgetItem();

item->setFlags(Qt::ItemIsSelectable|Qt::ItemIsUserCheckable|Qt::ItemIsEnabled);

item->setData(Qt::UserRole+1,data->at(i));

insertItem(model()->rowCount(),item);


QCheckBox*box=newQCheckBox(tr(columnlabels->at(i).toAscii().data()));

setItemWidget(item,box);

m_checklist.append(box);

m_fslist.append(columnlabels->at(i));

//链接复选状态改变信号槽


intval=QObject::connect(box,SIGNAL(stateChanged(int)),this,SLOT(set_select_item(int)));

qDebug()<<tr("链接checkbox消息:%1").arg(val);

}

}



public:

//返回用户选择项的用户自定义数据

voidget_select_data(QList<QVariant>&data)

{

for(inti=0;i<m_bchecked.size();i++)

{

if(m_bchecked.at(i)==true)

data.append(m_data.at(i));

}

}


privateslots:

//QCheckBox复选消息处理

voidset_select_item(intstate)

{

QCheckBox*box=qobject_cast<QCheckBox*>(sender());


for(intoff=0;off<m_checklist.size();off++)

{

if(box==m_checklist.at(off))

{

m_bchecked[off]=(box->checkState()==Qt::Checked)?true:false;

break;

}

}


QStringstrfs;

for(inti=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=newQComboBox();

MyListView*view=newMyListView(this,&strfs,&fstype,cmb);

cmb->setModel(view->model());//设置Model

cmb->setView(view);//设置视图

cmb->setEditable(true);//此处需要将QComboBox(来源:CSDN)


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: