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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM