我正在编写一个测试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();
}
答案 0 :(得分:1)
我做错了什么?
你已经创建了一个绑定循环,并且如果Qt没有通过强行打破循环来保护你自己,那么它会溢出堆栈。由于这只是一种保护机制,它唯一的工作就是防止冻结和崩溃。它不应该使您的应用程序正常运行。
你必须首先避免创建循环。
你可以这样做,例如通过不调用原始窗口小部件的setValue
插槽 - 请回想一下,setValue
信箱内的valueChanged
广告位已被调用。