c++ - 如何使自定义小部件内的子小部件的信号可连接?

标签 c++ qt qt5 qt-signals custom-widgets

我认为我对一个对我来说似乎非常基本的概念有一些重大问题。

我创建了一个自定义小部件,它实际上只是一个小部件集合,因此会出现多次。

class CustomWidget : public QWidget {
    Q_OBJECT
public:
    explicit CustomWidget(QWidget parent=nullptr) : QWidget(parent) {
        spinboxA = new QSpinBox;
        spinboxB = new QSpinBox;
        QHBoxLayout* layout = new QHBoxLayout(this);
        layout.addWidget(spinboxA);
        layout.addWidget(spinboxB);
        this->setLayout(layout);
    }
private:
    QSpinBox* spinboxA;
    QSpinBox* spinboxB;
};

然后在 GUI 中使用这个自定义小部件。当然,我希望这个 gui 对旋转框值的变化使用react。据我了解,我可以

1) 为QSpinBox提供getter,并在类外部连接它们的信号。 2)“重新路由”他们的信号,如下例所示

@1) 通过 connect(customwidget->getSpinboxA(),SIGNAL(valueChanged(int)),this,SLOT(doSomething(int))); 使用,我猜? >

@2)

class CustomWidget : public QWidget {
    Q_OBJECT
public:
    explicit CustomWidget(QWidget parent=nullptr) : QWidget(parent) {
        spinboxA = new QSpinBox;
        spinboxB = new QSpinBox;
        QHBoxLayout* layout = new QHBoxLayout;
        layout.addWidget(spinboxA);
        layout.addWidget(spinboxB);
        this->setLayout(layout);
        connect(spinboxA,SIGNAL(valueChanged(int)),//...
            this,SLOT(onSpinboxAValueChanged(int)));
    }
private:
    QSpinBox* spinboxA;
    QSpinBox* spinboxB;
private slots:
    void onSpinboxAValueChanged(int x) {emit spinboxAValueChanged(x);}
    //...
signals:
    void spinboxAValueChanged(int x)
};

在 gui 类中,connect(customwidget,SIGNAL(spinboxAValueChanged(int),this,SLOT(doSomething(int)));

尤其是版本 2) 看起来非常困惑并且...我在问自己 - 如何连接到自定义小部件内的小部件信号?

最佳答案

CustomWidget应该是模块化的,也就是说,它应该像一个黑盒子,应该在其中建立输入并获得输出,所以对我来说第二个解决方案非常接近它,但我看到一些可以改进的地方:不必创建一个插槽只是为了发出信号,信号可以连接到其他信号,我还建议使用新的连接语法。

#include <QApplication>
#include <QHBoxLayout>
#include <QSpinBox>
#include <QWidget>

#include <QDebug>

class CustomWidget : public QWidget {
    Q_OBJECT
public:
    explicit CustomWidget(QWidget *parent =nullptr):
        QWidget(parent),
        spinboxA(new QSpinBox),
        spinboxB(new QSpinBox)
    {
        QHBoxLayout* layout = new QHBoxLayout(this);
        layout->addWidget(spinboxA);
        layout->addWidget(spinboxB);
        connect(spinboxA, QOverload<int>::of(&QSpinBox::valueChanged), this, &CustomWidget::spinboxAValueChanged);
        connect(spinboxB, QOverload<int>::of(&QSpinBox::valueChanged), this, &CustomWidget::spinboxBValueChanged);
        // old syntax:
        // connect(spinboxA, SIGNAL(valueChanged(int)), this, SIGNAL(spinboxAValueChanged(int)));
        // connect(spinboxB, SIGNAL(valueChanged(int)), this, SIGNAL(spinboxBValueChanged(int)));
    }
private:
    QSpinBox *spinboxA;
    QSpinBox *spinboxB;
signals:
    void spinboxAValueChanged(int x);
    void spinboxBValueChanged(int x);
};

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

    QObject::connect(&w, &CustomWidget::spinboxAValueChanged, [](int i){
       qDebug()<< "spinboxAValueChanged: "<< i;
    });
    QObject::connect(&w, &CustomWidget::spinboxBValueChanged, [](int i){
       qDebug()<< "spinboxBValueChanged: "<< i;
    });

    w.show();

    return a.exec();
}

#include "main.moc"

关于c++ - 如何使自定义小部件内的子小部件的信号可连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52247999/

相关文章:

c++ - 显然相同的数学表达式具有不同的输出

c++ - 我无法将字符串存储到数组中,然后我想将其用于比较

qt - 修复 QML 中的水平滚动

c++ - 无法在 qgraphicsItem 中为 QTransform 设置动画

c++ - 在 Designer 的 Qt 5 中隐藏/显示 DockWidgets

C++,无法打开源文件 "ifstream"Visual Studio

c++ - 维护一个有序的(通过参数,int)集合

python - Xvfb IO 错误 : client killed

qt - 关闭 Qt creator 5 : "Unexpected CDB error" 后的错误消息

c++ - 在 main.cpp 中实现 MainWindow 时缺少 vtable