要在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

最新文章

  1. (转) 注意啦,笔记本是无线的,虚拟机上网方式莫用NAT,好难整。
  2. Hibernate反向工程在javaweb下的操作配置
  3. MySQL限时解答
  4. OC 对象和匿名对象
  5. [转]PO和VO、关于延迟加载(lazy)和强制加载(Hibernate.initialize(Object proxy) )
  6. poi生成excel
  7. iOS 对网络视频采集视频截图
  8. xcode 7种使用coredata遇到 Class not found, using default NSManagedObject instead.问题
  9. C语言qsort函数算法性能测试
  10. HP ProLiant DL380 G6 服务器 - 清 BIOS 的方法
  11. 【JDK1.8】JDK1.8集合源码阅读——IdentityHashMap
  12. Jerry 2017年的五一小长假:8种经典排序算法的ABAP实现
  13. BZOJ_3514_Codechef MARCH14 GERALD07加强版_主席树+LCT
  14. C#实战技能之WebApi+Task+WebSocket
  15. _ZNote_Qt_定时器的总结
  16. LNMP下动静分离部署phpmyadmin软件包
  17. 关于xftp上传文件状态错误的解决
  18. WP8.1 中获取背景色和主题色
  19. 3. 第一个程序Hello, World!
  20. Ajax-jQuery_Ajax_实例 ($.ajax、$.post、$.get)

热门文章

  1. Programming C#.Inheritance and Polymorphism
  2. Nginx+PostgreSQL+Django+UWSGI搭建
  3. vb6.0 时间日期
  4. JPEG图像密写研究(一) JPEG图像文件结构
  5. WebRTC 音视频开发
  6. 蓝牙1.1、蓝牙1.2、蓝牙2.0(蓝牙2.0+EDR)区别
  7. 修改ubuntu的默认python版本
  8. lighttpd配置虚拟主机/php等WEB环境
  9. BoundsChecker使用
  10. 菜鸟运维笔记:安装MySQL,PHP及phpMyAdmin