2013-09-24 4 views
5

मैंने चेकबॉक्स के साथ अपने आइटम के रूप में एक सरल combobox लिखा था। जब मैं कोई आइटम चुनता हूं और बटन दबाता हूं, तो यह दिखाता है कि मैंने कौन सी वस्तु चुनी है। लेकिन मैं ऐसा कुछ करना चाहता हूं: मेरे पास "सब" नामक एक वस्तु है - जब मैं इसे चुनता हूं, तो अन्य सभी वस्तुओं का चयन किया जाना चाहिए, और जब मैं इसे अचयनित करता हूं, तो अन्य सभी वस्तुओं को अचयनित किया जाना चाहिए। कोई विचार?कॉम्बोबॉक्स, चेकबॉक्स के अंदर कॉम्बोबॉक्स, सी ++ क्यूटी, सभी चेकबॉक्स का चयन/चयन रद्द करें

mainwindow.h

#ifndef MAINWINDOW_H 
#define MAINWINDOW_H 

#include <QMainWindow> 
#include <QStandardItemModel> 
#include <QComboBox> 

namespace Ui { 
class MainWindow; 
} 

class MainWindow : public QMainWindow 
{ 
    Q_OBJECT 

public: 
    explicit MainWindow(QWidget *parent = 0); 
    ~MainWindow(); 

private: 
    Ui::MainWindow *ui; 
    QStandardItemModel *model; 

private slots: 

    void buttonclicked(); 
}; 

#endif // MAINWINDOW_H 

mainwindow.cpp

#include "mainwindow.h" 
#include "ui_mainwindow.h" 
#include <iostream> 
#include <QDebug> 

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 

    this->model = new QStandardItemModel(4, 1); // 4 rows, 1 col 
    for (int r = 0; r < 4; ++r) 
    { 
     QStandardItem* item; 
     if(r == 0) 
      item = new QStandardItem(QString("All")); 
     else 
      item = new QStandardItem(QString("Item %0").arg(r)); 

     item->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled); 
     item->setData(Qt::Unchecked, Qt::CheckStateRole); 

     model->setItem(r, 0, item); 
    } 

    ui->comboBox->setModel(model); 

    connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(buttonclicked())); 
} 

void MainWindow::buttonclicked() 
{ 
    unsigned int i; 
    for(i=0; i<ui->comboBox->count(); i++) 
    { 
     QModelIndex index = ui->comboBox->model()->index(i, 0); 
     QVariant v = index.data(Qt::CheckStateRole); 
     int j = v.toInt(); 
     if(j == 2) 
     { 
      QModelIndex ii = ui->comboBox->model()->index(i, 0); 
      QString text = ii.data(Qt::DisplayRole).toString(); 
      qDebug() << text; 
     } 

    } 
    qDebug()<<""; 
} 

MainWindow::~MainWindow() 
{ 
    delete ui; 
} 

main.cpp

#include "mainwindow.h" 
#include <QApplication> 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    MainWindow w; 
    w.show(); 

    return a.exec(); 
} 

ui फ़ाइल

<?xml version="1.0" encoding="UTF-8"?> 
<ui version="4.0"> 
<class>MainWindow</class> 
<widget class="QMainWindow" name="MainWindow"> 
    <property name="geometry"> 
    <rect> 
    <x>0</x> 
    <y>0</y> 
    <width>400</width> 
    <height>300</height> 
    </rect> 
    </property> 
    <property name="windowTitle"> 
    <string>MainWindow</string> 
    </property> 
    <widget class="QWidget" name="centralWidget"> 
    <widget class="QComboBox" name="comboBox"> 
    <property name="geometry"> 
    <rect> 
     <x>100</x> 
     <y>50</y> 
     <width>201</width> 
     <height>23</height> 
    </rect> 
    </property> 
    </widget> 
    <widget class="QPushButton" name="pushButton"> 
    <property name="geometry"> 
    <rect> 
     <x>110</x> 
     <y>100</y> 
     <width>181</width> 
     <height>23</height> 
    </rect> 
    </property> 
    <property name="text"> 
    <string>Check what was selected</string> 
    </property> 
    </widget> 
    </widget> 
    <widget class="QMenuBar" name="menuBar"> 
    <property name="geometry"> 
    <rect> 
    <x>0</x> 
    <y>0</y> 
    <width>400</width> 
    <height>20</height> 
    </rect> 
    </property> 
    </widget> 
    <widget class="QToolBar" name="mainToolBar"> 
    <attribute name="toolBarArea"> 
    <enum>TopToolBarArea</enum> 
    </attribute> 
    <attribute name="toolBarBreak"> 
    <bool>false</bool> 
    </attribute> 
    </widget> 
    <widget class="QStatusBar" name="statusBar"/> 
</widget> 
<layoutdefault spacing="6" margin="11"/> 
<resources/> 
<connections/> 
</ui> 

यह इस तरह दिखता है:

enter image description here

उत्तर

1

इस बटन के लिए एक qtslot लागू इस तरह जब यह क्लिक किया जाता है/शुरू हो आप इच्छित भीतर चेक बॉक्स का सब कुछ खत्म पुनरावृति जाएगा कि combobox और उनके चेक किए गए राज्य को संपादित करें।

+0

बटन के लिए, चेकबॉक्स के लिए नहीं? –

+0

सही। कार्रवाई तब होती है जब 'सभी' बटन क्लिक किया जाता है, आप जो करते हैं वह combobox की सामग्री के लिए होगा। – UpAndAdam

+0

ओह, आपका मतलब कोई बटन नहीं है, आपका मतलब है कि 'सब' नामक कंबोबॉक्स के भीतर एक शाब्दिक वस्तु है? मैं आपके जीवन को आसान बना दूंगा और कंबोबॉक्स के ऊपर एक बटन होगा कि यदि टॉगल किया गया तो या तो बॉक्स में सभी आइटमों का चयन रद्द कर देगा या सभी को अचयनित कर देगा।कम्बोबॉक्स के भीतर सभी वस्तुओं को अन्य वस्तुओं को प्रबंधित करने के लिए कितना आसान और टालना पड़ता है, जिसे उन्हें आमतौर पर – UpAndAdam

0

मैं अपने कोड का उपयोग करके चेकबॉक्स सूची को दोहराने का प्रयास करते समय मॉडल सबक्लासिंग का उपयोग कैसे करना सीख रहा हूं और सूची परिवर्तनों को पॉप्युलेट करने वाले किसी भी चेकबॉक्स में चेक स्थिति के दौरान सिग्नल ट्रिगर करने का एक तरीका मिला है।

MainWindow.h में एक सार्वजनिक स्लॉट की घोषणा:

public slots: 
     void itemCheck(QModelIndex a, QModelIndex b); 

MainWindow.cpp में स्लॉट को लागू:

void MainWindow::void itemCheck(QModelIndex a, QModelIndex b) 
{ 
    qDebug() << "check event"; 
} 

और मॉडल dataChanged संकेत के लिए इस नए स्लॉट जोड़ने:

connect(ui->comboBox->model(), SIGNAL(dataChanged(QModelIndex, QModelIndex, QVector<int>)), this, SLOT(itemCheck(QModelIndex, QModelIndex))); 

मैं पतला के, "ऑल" चेकबॉक्स के लिए ईवेंट को फ़िल्टर करना संभव है और अन्य को उचित रूप से सेट करना संभव है। यह काम कर रहा पाने में कामयाब रहे:

void MainWindow::itemCheck(QModelIndex a, QModelIndex b) 
{ 
    qint16 i; 
    QModelIndex cycleIndex; 
    // if "All" checked 
    if (a.row() == 0) 
    { 
     // blocking new dataChanged singnal while managing other checkboxes 
     ui->comboBox->model()->blockSignals(true); 
     // setting other checkboxes appropriately 
     if (a.data(Qt::CheckStateRole).toBool()) 
     { 
      for (i = 1; i<ui->comboBox->count(); i++) 
      { 
       cycleIndex = ui->comboBox->model()->index(i, 0); 
       ui->comboBox->model()->setData(cycleIndex, Qt::Checked, Qt::CheckStateRole); 
      } 
     } else 
     { 
      for (i = 1; i<ui->comboBox->count(); i++) 
      { 
       cycleIndex = ui->comboBox->model()->index(i, 0); 
       ui->comboBox->model()->setData(cycleIndex, Qt::Unchecked, Qt::CheckStateRole); 
      } 
     } 
     ui->comboBox->model()->blockSignals(false); 
    } 
} 

आशा इस कोई खरोंच से क्यूटी सीखने में मदद मिलेगी।

संबंधित मुद्दे