我正在编写一个测试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();
}
最佳答案
您已经创建了一个绑定(bind)循环,如果Qt不能通过强行破坏循环来保护您自己,则将导致堆栈溢出。由于这只是一种保护机制,因此它唯一的作用就是防止冻结和崩溃。不应使您的应用程序正常运行。
您必须首先避免创建循环。
您可以这样做,例如通过不调用原始窗口小部件的setValue
插槽-回忆起您的setValue
插槽是从valueChanged
信号的主体内调用的。
关于c++ - Qt信号转发-我在做什么错?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44116230/