QT信号和插槽不工作,给出错误消息

时间:2017-06-24 16:28:49

标签: c++ qt qt-signals qt-slot

我是Qt的新手并尝试写信号和插槽。下面是我试图运行的代码。使用SLOT和SIGNAL关键字" connect"功能,它工作正常。但我不想在连接函数上使用SIGNAL和SLOT关键字,而是想使用不同的方法。

  class MyWindow:public QMainWindow
  {
      Q_OBJECT
  public:
      MyWindow();
  };

  MyWindow::MyWindow()
  {
     QWidget *widget=new QWidget;
     QHBoxLayout *layout =new QHBoxLayout;
     QSpinBox *mySlide = new QSpinBox;
     mySlide->setRange(0,10);
     QLCDNumber *lcdNumber= new QLCDNumber;
     layout->addWidget(mySlide);
     layout->addWidget(lcdNumber);

       connect(mySlide,SIGNAL(valueChanged(int)),lcdNumber,SLOT(display(int)));
    // connect(mySlide, &QSpinBox::valueChanged,lcdNumber, &QLCDNumber::display);

      widget->setLayout(layout);
      setCentralWidget(widget);
   }

在上面的代码中,未注释的连接功能工作正常但注释连接功能不起作用。我收到错误"没有匹配函数来调用MyWindow :: connect"。不知道我在这里犯了什么错误。我是从qt关注这篇文章的。

http://doc.qt.io/qt-5/qtopengl-hellogl2-window-cpp.html

1 个答案:

答案 0 :(得分:2)

问题是信号 - QSpinBox::valueChanged - 和插槽 - QLCDNumber::display - 对于不同的参数类型都有多个重载。你有几个选择。

1)使用static_cast消除各种信号和插槽过载之间的歧义......

connect(mySlide,
        static_cast<void(QSpinBox::*)(int)>(&QSpinBox::valueChanged),
        lcdNumber,
        static_cast<void(QLCDNumber::*)(int)>(&QLCDNumber::display));

...或

2)只需使用lambda ...

connect(mySlide, static_cast<void(QSpinBox::*)(int)>(&QSpinBox::valueChanged),
        [lcdNumber](int value)
        {
          lcdNumber->display(value);
        });

尽管使用lambda still信号需要static_cast