我正在编写一个测试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/

10-11 23:10
查看更多