我想了解如何在 Qt5 中基于方法指针使用信号和槽的新语法。我从书中获取了以下代码:
#include <QApplication>
#include <QHBoxLayout>
#include <QSlider>
#include <QSpinBox>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QWidget* window = new QWidget;
window->setWindowTitle("Set your age");
QSpinBox* spinBox = new QSpinBox;
QSlider* slider = new QSlider(Qt::Horizontal);
spinBox->setRange(0, 130);
slider->setRange(0, 130);
QObject::connect(spinBox, &QSpinBox::valueChanged, slider, &QSlider::setValue);
QObject::connect(slider, SIGNAL(valueChanged(int)), spinBox, SLOT(setValue(int)));
spinBox->setValue(35);
QHBoxLayout* layout = new QHBoxLayout;
layout->addWidget(spinBox);
layout->addWidget(slider);
window->setLayout(layout);
window->show();
return app.exec();
}
我稍微更正了该行,以便使用指向方法的指针而不是宏:
QObject::connect(spinBox, &QSpinBox::valueChanged, slider, &QSlider::setValue);
此后,代码停止编译并抛出错误
错误:没有匹配的函数可用于调用 'QObject::connect(QSpinBox*&, <未解析的重载函数类型>, QSlider*&, void (QAbstractSlider::*)(int))' 17 |
QObject::connect(spinBox, &QSpinBox::valueChanged, slider, &QSlider::setValue); | ~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~
如何在新语法中正确使用信号和槽以避免出现此错误?
问题的出现是因为调用
connect并不清楚valueChanged要使用哪个重载。QSpinBox班级里有两个人:顺便说一句,在关于这个信号的帮助中,它准确地指出了如何解决这个问题:
使用qOverload帮助程序模板可以更简洁地完成此操作:
但在Qt6(问题标题中提到)中似乎不会出现这样的问题,因为 他们删除了字符串重载,现在它有了自己的名字: