gpt4 book ai didi

c++ - Qt 信号转发 - 我做错了什么?

转载 作者:行者123 更新时间:2023-11-30 05:13:07 25 4
gpt4 key购买 nike

我正在编写一个测试 Qt 应用程序,其中一切正常,直到我尝试通过槽接收信号然后发出另一个信号(MyWidget::setValue 不会导致发出 MyWidget::valueChanged)。我做错了什么?

#include <QApplication>
#include <QVBoxLayout>
#include <QSpinBox>
#include <QSlider>

class MyWidget: public QWidget {
Q_OBJECT
signals:
void valueChanged(int value);
public slots:
void setValue(int value){
emit valueChanged(value);
}
};

int main(int argc, char *argv[])
{
QApplication app(argc, argv);
MyWidget* win = new MyWidget;
QVBoxLayout* layout = new QVBoxLayout(win);
QSpinBox* spin =new QSpinBox();
QSlider* slider = new QSlider(Qt::Horizontal);

spin->setMinimum(-100);
spin->setMaximum(100);

slider->setMinimum(-100);
slider->setMaximum(100);

layout->addWidget(spin);
layout->addWidget(slider);

QObject::connect(spin, SIGNAL(valueChanged(int)), slider, SLOT(setValue(int)));
QObject::connect(slider, SIGNAL(valueChanged(int)), win, SLOT(setValue(int)));
QObject::connect(win, SIGNAL(valueChanged(int)), spin, SLOT(setValue(int)));

win->show();
return app.exec();
}

最佳答案

What am I doing wrong?

您已经创建了一个绑定(bind)循环,如果 Qt 没有通过强行中断循环来保护您免受您自己的伤害,那么您将溢出堆栈。由于这只是一种保护机制,它的唯一工作就是防止卡住和崩溃。它不应该使您的应用程序正常运行。

您必须首先避免创建循环。

你可以这样做,例如通过不调用原始小部件的 setValue 插槽 - 回想一下,您的 setValue 插槽是从 valueChanged 信号主体中调用的。

关于c++ - Qt 信号转发 - 我做错了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44116230/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com