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

时间:2017-05-22 15:00:33

标签: c++ qt

我正在编写一个测试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();
}

1 个答案:

答案 0 :(得分:1)

  

我做错了什么?

你已经创建了一个绑定循环,并且如果Qt没有通过强行打破循环来保护你自己,那么它会溢出堆栈。由于这只是一种保护机制,它唯一的工作就是防止冻结和崩溃。它不应该使您的应用程序正常运行。

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

你可以这样做,例如通过不调用原始窗口小部件的setValue插槽 - 请回想一下,setValue信箱内的valueChanged广告位已被调用。