• 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

  • 相关阅读:
    支付业务的数据库表的设计
    数据库设计的一些参考(来源网上的一些帖子,仅供作者本人参考)
    Delphi 10.2的 更新说明,所有官方资料:新特征和Bugfix列表,所有工具开发说明
    日本太笨了,以小目标发动大战争,而且偷袭时候如小贼入室,一旦得手就仓皇逃窜
    理论经典:TCP协议的3次握手与4次挥手过程详解
    C++没有库则寸步难行,有库则几乎可以做任何事情——Bjarne Stroustrupi
    Ruby已经慢慢走向衰退了,那些年代久远而且小众的语言没有翻身的可能性
    前端面试题精选
    Spring MVC 基础
    NET WEB
  • 原文地址:https://www.cnblogs.com/findumars/p/5604847.html
Copyright © 2020-2023  润新知