使用新的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" 不明确。