【问题标题】:QT signal and slot not working giving an error message [duplicate]QT信号和插槽不工作给出错误消息[重复]
【发布时间】:2017-11-28 01:02:52
【问题描述】:

我是 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

【问题讨论】:

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


    【解决方案1】:

    问题在于信号——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

    【讨论】:

    • 非常感谢。它确实奏效了。但只是想知道为什么 connect(mySlide, SIGNAL(valueChanged(int)),lcdNumber, &QLCDNumber::display) 不起作用。第一部分是明确的信号。
    • 您不能在各种信号/槽语法之间混合和匹配。它要么是所有 SIGNAL 和 SLOT 语法 ,要么是 指向成员语法的新指针。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多