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的TextEdit設置爲可編輯,以便選擇結果的顯示

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章