5

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

主窗口.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

主窗口.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;
}

主文件

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

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

    return a.exec();
}

用户界面文件

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

它看起来像这样:

在此处输入图像描述

4

2 回答 2

1

为此按钮实现一个qtslot,这样当它被单击/触发时,您将遍历所需组合框中的所有复选框并编辑它们的选中状态。

于 2013-09-24T19:23:35.593 回答
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);
    }
}

希望这将有助于从头开始学习 Qt 的人。

于 2016-12-07T12:25:01.500 回答