2013-09-24 95 views
5

我写了一个简单的组合框与复选框作为其项目。当我选择一个项目并按下按钮时,它会显示我选择的项目。但我想做这样的事情:我有一个名为“全部”的项目 - 当我选择它时,应该选择所有其他项目,并且当我取消选择它时,所有其他项目应该被取消选择。有任何想法吗?的组合框里面复选框,C++的Qt,选择/取消选择所有复选框

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使得点击时/被触发,你会遍历所有的复选框内的所需组合框并编辑它们的选中状态。

+0

的按钮,而不是复选框? –

+0

正确。该行动是在点击“全部”按钮时,你做什么将是组合框的内容。 – UpAndAdam

+0

哦,你不是指一个按钮,你的意思是在名为'all'的组合框中有一个文字项目?我会让你的生活更轻松,并且在组合框上方有一个按钮,如果选择了全部或取消选择框中的所有项目。更容易,并避免必须教组合框中的所有项目如何管理其他项目,他通常不应该知道关于 – 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))); 

我瘦了K,所以能够筛选“全部”复选框事件并相应地设置其他的。 设法得到它的工作:

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

希望这会帮助别人从头开始学习Qt的。