2013-09-24 12 views
5

Ho scritto una semplice casella combinata con caselle di controllo come elementi. Quando seleziono un oggetto e premo il pulsante, mostra quale elemento ho selezionato. Ma mi piacerebbe fare qualcosa del genere: ho un oggetto chiamato "all" - quando lo seleziono, tutti gli altri elementi dovrebbero essere selezionati, e quando lo deseleziono, tutti gli altri elementi dovrebbero essere deselezionati. Qualche idea?ComboBox con caselle di controllo all'interno, C++ Qt, seleziona/deseleziona tutte le caselle di controllo

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 file di

<?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> 

Ecco come si presenta:

enter image description here

risposta

1

implementare un qtslot per questo pulsante in modo tale che quando viene cliccato/attivato si iterare su tutte le caselle di controllo all'interno del desiderato combobox e modifica il loro stato controllato.

+0

per pulsante, non per casella di controllo? –

+0

corretto. L'azione è quando si fa clic sul pulsante "tutto", ciò che si farà sarà nei contenuti della casella combinata. – UpAndAdam

+0

oh non intendi un pulsante, vuoi dire avere un oggetto letterale all'interno della casella combinata denominata "tutto"? Ti renderei la vita più facile e un pulsante sopra la casella combinata che, se toggiato, selezionerebbe tutto o deselezionerà tutti gli elementi nella casella.Molto più facile ed evita di dover insegnare a tutti gli oggetti all'interno della casella combinata come gestire gli altri elementi, che in genere non dovrebbe sapere su – UpAndAdam

0

Ho imparato a utilizzare la sottoclasse di modelli durante il tentativo di replicare l'elenco delle caselle di controllo utilizzando il codice e ho trovato un modo per attivare un segnale quando lo stato di controllo in una delle caselle di controllo che compongono l'elenco cambia.

Dichiarazione di una fessura pubblica in MainWindow.h:

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

Attuare la fessura mainwindow.cpp:

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

e collegamento di questo nuovo slot per segnale DataChanged il modello del :

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

I sottile k, è possibile filtrare l'evento per la casella di controllo "Tutto" e impostare gli altri in modo appropriato. riuscito a farlo lavorare:

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); 
    } 
} 

Spero che questo vi aiuterà qualcuno imparare Qt da zero.

Problemi correlati