我是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关注这篇文章的。
答案 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
。