2016-02-26 1 views
0

Когда я пытаюсь подключиться с использованием старого механизма сигнала/слота, он работает нормально, но он дает мне ошибку компиляции с использованием новой:Ошибка компиляции при подключении QTcpSocket :: error() с использованием нового механизма сигнала/слота Qt5

// 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 не знает, с которым следует использовать. Если есть два одинаковых сигнала, но разные параметры, MOC путается с тем, что вы имеете в виду.

Для этого иногда лучше использовать «старый» синтаксис, чем новый.

От doc вы можете найти такую ​​же функцию, как хороший пример того, что:

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

С одной МОС следует использовать? :)

Редактирование: Я знаю, что один из них - сигнал, другой - нормальная функция, но с точки зрения MOC это не имеет значения, обе являются «функциями» с точки зрения C++. Только различие заключается в «генерации кода C++ из MOC» (поскольку сигналы/слоты «создаются компилятором moc»)

 Смежные вопросы

  • Нет связанных вопросов^_^