使用新的Qt5 signal/slot机制连接QTcpSocket::error()时编译报错
Compile error when connecting QTcpSocket::error() using the new Qt5 signal/slot mechanism
当我尝试使用旧的 signal/slot 机制进行连接时,它工作正常,但使用新机制时出现编译错误:
// Old mechanism, this works:
connect(socket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(onError(QAbstractSocket::SocketError)));
// Compile error when using the template version:
connect(socket, &QTcpSocket::error, this, &MainWindow::onError);
这是我得到的错误:
error: no matching function for call to 'MainWindow::connect(QTcpSocket*&, , MainWindow*, void (MainWindow::*)(QAbstractSocket::SocketError))'
connect(socket, &QTcpSocket::error, this, &MainWindow::onError);
^
我的槽函数:
class MainWindow : public QMainWindow
{
Q_OBJECT
private slots:
void onError(QAbstractSocket::SocketError);
我发现了一个 similar thread on Qt forums,他们说这是 Qt 中的一个错误,但会在 5.1 中修复。但是,我的版本是 5.4.2(使用 MinGW)。
这是真正的 Qt 错误,还是我的语法错误?
你的 link 是错误的,原因是 MOC 编译器不知道应该使用哪个。
如果有 2 个相同名称的信号但参数不同,MOC 会与您的意思混淆。
这就是为什么有时使用 'old' 语法比使用新语法更好。
从 doc 你可以找到相同的函数作为很好的例子:
error() const : SocketError
error(QAbstractSocket::SocketError)
用一个MOC应该怎么用? :)
编辑:我知道其中一个是信号,另一个是正常功能,但从 MOC 的角度来看,这无关紧要,从 C++ 的角度来看,两者都是 'functions'。
唯一的区别是 'generate c++ code from MOC'(因为 signals/slots 是 'created by moc compiler')
您有权 link 访问 Qt 论坛,但读错了部分。在此页面上查找 static_cast。
connect (socket, static_cast<void (QTcpSocket::*)(QAbstractSocket::SocketError)>(&QAbstractSocket::error), this, &MainWindow::onError);
这个(不是很优雅)转换是必要的,因为方法名称 "error" 不明确。
当我尝试使用旧的 signal/slot 机制进行连接时,它工作正常,但使用新机制时出现编译错误:
// Old mechanism, this works:
connect(socket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(onError(QAbstractSocket::SocketError)));
// Compile error when using the template version:
connect(socket, &QTcpSocket::error, this, &MainWindow::onError);
这是我得到的错误:
error: no matching function for call to 'MainWindow::connect(QTcpSocket*&, , MainWindow*, void (MainWindow::*)(QAbstractSocket::SocketError))' connect(socket, &QTcpSocket::error, this, &MainWindow::onError); ^
我的槽函数:
class MainWindow : public QMainWindow
{
Q_OBJECT
private slots:
void onError(QAbstractSocket::SocketError);
我发现了一个 similar thread on Qt forums,他们说这是 Qt 中的一个错误,但会在 5.1 中修复。但是,我的版本是 5.4.2(使用 MinGW)。
这是真正的 Qt 错误,还是我的语法错误?
你的 link 是错误的,原因是 MOC 编译器不知道应该使用哪个。 如果有 2 个相同名称的信号但参数不同,MOC 会与您的意思混淆。
这就是为什么有时使用 'old' 语法比使用新语法更好。
从 doc 你可以找到相同的函数作为很好的例子:
error() const : SocketError
error(QAbstractSocket::SocketError)
用一个MOC应该怎么用? :)
编辑:我知道其中一个是信号,另一个是正常功能,但从 MOC 的角度来看,这无关紧要,从 C++ 的角度来看,两者都是 'functions'。 唯一的区别是 'generate c++ code from MOC'(因为 signals/slots 是 'created by moc compiler')
您有权 link 访问 Qt 论坛,但读错了部分。在此页面上查找 static_cast。
connect (socket, static_cast<void (QTcpSocket::*)(QAbstractSocket::SocketError)>(&QAbstractSocket::error), this, &MainWindow::onError);
这个(不是很优雅)转换是必要的,因为方法名称 "error" 不明确。