c++ - 仅当 QCheckBox 被选中时才发出信号

标签 c++ qt signals-slots

我正在根据一些用户输入动态创建一组 QCheckBox,如下所示:

QWidget *wid = new QWidget();
QVBoxLayout *layout = new QVBoxLayout();
for(int i=0; i<NumberModes; i++)
{
    int k = Amplitudes(i,0);
    int m = Amplitudes(i,1);

    QString ks = QString::number(k);
    QString ms = QString::number(m);
    QString position = QString::number(i);
    QString mode = "A"+ks+ms;

    QCheckBox *check = new QCheckBox(mode);
    connect(check, SIGNAL(toggled(bool)), &mapper, SLOT(map()));
    connect(check, SIGNAL(toggled(bool)), &SelectModes, SLOT(map()));

    mapper.setMapping(check,position);
    SelectModes.setMapping(check,mode);
    layout->addWidget(check);
    updateGeometry();
}


wid->setLayout(layout);
ui->scrollArea->setWidget(wid);

然后 QSignalMapper 连接到另一个执行一些计算的类:

connect(&SelectModes, SIGNAL(mapped(QString)), this, SIGNAL(CheckBoxClicked2(QString)));
connect(this, SIGNAL(CheckBoxClicked2(QString)), &Supress2, SLOT(ListenSelectedModes(QString)));
connect(&mapper, SIGNAL(mapped(QString)), this, SIGNAL(CheckBoxClicked(QString)));
connect(this, SIGNAL(CheckBoxClicked(QString)), &Suppress, SLOT(ListenSelectedModes(QString)));

我需要的是类仅在 QCheckBox 被选中时接收信号;这意味着如果您检查一次,然后取消检查,则不应发出或接收任何信号。不确定最好的方法是什么。 有什么想法吗?

最佳答案

使用 C++11,无需 QSignalMapper 即可轻松实现。这是一个工作示例。

#include <QWidget>
#include <QCheckBox>
#include <QVBoxLayout>

class QCheckBox;

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);

signals:
    void checkBoxChecked(QCheckBox *checkBox);
};


Widget::Widget(QWidget *parent) :
    QWidget(parent)
{
    QVBoxLayout *layout = new QVBoxLayout;

    for (int i = 0; i < 10; ++i) {
        QCheckBox *checkBox = new QCheckBox("CheckBox " + QString::number(i + 1));

        connect(checkBox, &QCheckBox::toggled, [=](bool checked) {
            if (checked)
                emit checkBoxChecked(checkBox);
        });

        layout->addWidget(checkBox);
    }

    setLayout(layout);
}

关于c++ - 仅当 QCheckBox 被选中时才发出信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18990515/

相关文章:

c++ - 如何对两个并行数组进行排序?

c++ - DLL 中的 Qt GUI 环境(VST 插件)

qt - 在 EGL 上渲染时的 OpenGL 撕裂效果

c++ - InvokeMethod 不适用于 SLOT(...),但适用于 conts char *

C++:运算符 delete(void*) protected

c++ - 在 C++ 中,当元素索引在运行时已知时,是否可以获取元组中一个元素的类型?

c++ - 非虚拟成员函数可以使用模板参数吗?

c++ - 隐藏 Qt 选项卡的标签文本而不将文本设置为空字符串

c++ - Qthread信号发出未连接

c++ - 找到 `destroyed(QObject*)`信号的发送者