2

我是 Qt 的新手,正在尝试编写信号和插槽。下面是我试图运行的代码。在“连接”功能上使用 SLOT 和 SIGNAL 关键字,它工作正常。但我不想在连接函数上使用 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

4

1 回答 1

2

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

1)使用 astatic_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信号。

于 2017-06-24T17:08:38.263 回答