我正试图掌握Qt的信号和插槽机制。我有一个带有QPushButton和QSpinBox的应用程序。当我单击按钮时,我希望旋转框更改为20.我需要设置什么信号和插槽?

下面的代码显示了应用程序,连接功能是我遇到的问题。 据我所知,QSpinBox的setValue(int)槽在这里不起作用,因为QPushButton的clicked()信号有不同的签名,无论如何我如何将值20传递给spinbox?我是否需要编写某种辅助函数来充当调用spinbox-> setValue(20)的插槽?如果是这样,会采取什么形式?

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    QWidget *window = new QWidget;
    QSpinBox *spinbox = new QSpinBox;
    QPushButton *button = new QPushButton("Set to 20");

    spinbox->setRange(0, 100);

    // What should I put below?
    QObject::connect(button, SIGNAL(clicked()), spinbox, SLOT(???????));

    QLayout *layout = new QHBoxLayout;
    layout->addWidget(spinbox);
    layout->addWidget(button);
    window->setLayout(layout);

    window->show();

    return app.exec();

}
有帮助吗?

解决方案

您可以这样做:

class AuxSignals : public QObject
{
    Q_OBJECT
    ...
    signals:
        void valueChanged(int);
    public slots:
        void buttonClicked() { emit valueChanged(20); }
};

...

// On main.cpp
AuxSignals *auxSignals = new AuxSignals;

QObject::connect(button, SIGNAL(clicked()), auxSignal, SLOT(buttonClicked));
QObject::connect(auxSignals, SIGNAL(valueChanged(int)), spinbox, SLOT(setValue(int)));

class AuxSignals : public QObject
{
    Q_OBJECT
    ...
    QSpinBox *m_spinBox;
    public:
        AuxSignals(QSpinBox *spinBox) : m_spinBox(spinBox) {}
    public slots:
        void buttonClicked() { m_spinBox->setValue(20); }
};

...

// On main.cpp
AuxSignals *auxSignals = new AuxSignals(spinBox);

QObject::connect(button, SIGNAL(clicked()), auxSignals, SLOT(buttonClicked()));

我更喜欢第一个选项,因为它不需要AuxSignals类有一个指向特定QWidget的指针。

其他提示

我认为你在这里看一个自定义SLOT。 QPushButton :: clicked 信号将给出一个布尔( true | false )事件。如果你使用 QSpinBox :: setValue 捕获它,你就不会走得太远。 QSpinBox :: setValue 需要一个int,并根据具体情况将输入布尔值转换为0或1,并且您的spinbox仅增加1个单位。如果您要编写自定义 SLOT ,您实际上可以通过更多控制来设置确切的滑块值。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top