带有Checkboxes的ComboBox,C ++ Qt,选中/取消选中所有复选框

时间:2013-09-24 19:18:29

标签: c++ qt checkbox combobox

我写了一个简单的组合框,其中包含复选框。当我选择一个项目并按下按钮时,它会显示我选择的项目。但是我想做这样的事情:我有一个名为“all”的项目 - 当我选择它时,应该选择所有其他项目,当我取消选择它时,所有其他项目都应该被取消选择。有什么想法吗?

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

2 个答案:

答案 0 :(得分:1)

为此按钮实施qtslot,以便在单击/触发时,您将遍历所需组合框中的所有复选框并编辑其已检查状态。

答案 1 :(得分: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)));

我认为,可以过滤“All”复选框的事件并适当地设置其他事件。 管理让它运作:

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。