2016-02-26 48 views
0

當我嘗試使用舊的信號/插槽機制進行連接時,它工作正常,但它給了我一個使用新的編譯錯誤:使用新的Qt5信號/插槽機制連接QTcpSocket :: error()時編譯錯誤

// 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

你有正確的鏈接到Qt論壇,但讀了錯誤的部分。在此頁面上查找static_cast。

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

這(不是很優雅)轉換是必要的,因爲方法名「錯誤」是不明確的。

+1

參見http://doc.qt.io/qt-5/signalsandslots-syntaxes.html#selecting-overloaded-signals-and-slots – JKSH

1

你的鏈接有誤,原因是MOC編譯器不知道應該用什麼。 如果有2個相同的名稱信號,但不同的參數,MOC與你的意思混淆。

這就是爲什麼有時使用'舊'語法比新語法更好。

doc你可以找到相同的功能,作爲很好的例子:

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

有了一個MOC應該使用? :)

編輯:我知道其中之一是信號,其他是正常的功能,但從MOC的角度來看,這並不重要,從C++的角度來看都是'功能'。 唯一的區別是'生成來自MOC的C++代碼'(因爲信號/插槽是'由moc編譯器創建的')