使用新的Qt5信号/插槽机制连接QTcpSocket :: error()时编译错误

时间:2016-02-26 15:23:40

标签: c++ qt compiler-errors mingw signals-slots

当我尝试使用旧的信号/插槽机制进行连接时,它工作正常,但它使用新的一个编译错误:

// 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错误,还是我的语法错误?

2 个答案:

答案 0 :(得分:2)

您有与Qt论坛的正确链接,但阅读错误的部分。在此页面上查找static_cast。

connect (socket, static_cast<void (QTcpSocket::*)(QAbstractSocket::SocketError)>(&QAbstractSocket::error), this, &MainWindow::onError);

这个(不是很优雅)演员是必要的,因为方法名称&#34;错误&#34;很暧昧。

答案 1 :(得分:1)

您的链接错误,原因是MOC编译器不知道应该使用哪一个。 如果有2个相同的名称信号但是不同的参数,则MOC与您的意思相混淆。

为什么有时候使用'旧'语法比使用新语法更好。

doc您可以找到相同的功能作为其中的好例子:

error() const : SocketError
error(QAbstractSocket::SocketError)

有一个MOC应该使用? :)

编辑:我知道其中一个是信号,其他是正常功能,但从MOC的角度来看,这没关系,从C ++的角度来看都是'函数'。 唯一的区别是'从MOC生成c ++代码'(因为信号/插槽是'由moc编译器'创建的)