当我尝试使用旧的信号/插槽机制进行连接时,它工作正常,但它使用新的一个编译错误:
// 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错误,还是我的语法错误?
答案 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编译器'创建的)