Сигнал QT и слот не работают с сообщением об ошибке
Я новичок в 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);
}
В приведенном выше коде функция uncommented connect работает нормально, но функция подключения с комментариями не работает. Я получаю сообщение об ошибке "Нет подходящей функции для вызова MyWindow::connect". Не уверен, какую ошибку я совершил здесь. Я следил за этой статьей из Qt.
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
по сигналу.