zoukankan      html  css  js  c++  java
  • QListWidget的QComboBox下拉列表添加复选框及消息处理

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

  • 相关阅读:
    超详细的Chrome插件Vimium使用教程!
    Chrome浏览器快捷键详细介绍,让你摆脱鼠标的束缚!
    为什么你的电脑越来越卡?很可能是因为这个!
    像黑客一样用命令打开应用!
    电脑桌面乱?看完这篇文章是不存在这种情况的!
    任务栏简化,让你的任务栏更美观!
    USB无法识别?简单详细的驱动程序安装教程!
    文件扩展名是什么?有什么用?通俗易懂的文件扩展名讲解!
    Win2008 IIS7.5安装配置PHP7.3.2步骤,及500错误解决
    用命令行方式关闭CentOS防火墙
  • 原文地址:https://www.cnblogs.com/findumars/p/5604847.html
Copyright © 2011-2022 走看看