2015-06-12 2 views
2

Я пытаюсь использовать новый синтаксис сигнала и слота, но я получаю ошибку компиляции при подключении. Как использовать новый синтаксис в этом случае?Синтаксис синтаксиса нового синтаксиса QSerialPort отсутствует соответствующая функция-член для вызова 'connect'

// Qt 5.4.1, Apple LLVM version 6.1.0 and qmake 3.0 
private slots: 
    void onError(QSerialPort::SerialPortError code); 

private: 
    QSerialPort *m_port; 

Link::Link(QObject *parent) : QObject(parent) { 
    m_port = new QSerialPort(parent); 

    connect(m_port, &QSerialPort::error, this, &Link::onError); 
} 

Полное сообщение об ошибке:

error: no matching member function for call to 'connect' 
connect(m_port, &QSerialPort::error, this, &Link::onError); 
    ^~~~~~~ 

candidate function not viable: no overload of 'error' matching 'const char *' for 2nd argument 
static QMetaObject::Connection connect(const QObject *sender, const char *signal, 
          ^
+0

Какая версия Qt и компилятор и на какой платформе вы используете? –

+0

Я использую Qt 5.4.1 и Apple LLVM версии 6.1.0 @MichaelBurr – Ricardo

ответ

5

Проблема заключается в том, что &QSerialPort::error неоднозначна:

Там же сигнал вы пытаетесь подключиться к: QSerialPort::error(QSerialPort::SerialPortError)

Но есть также однопользовательский газопоглотитель: QSerialPort::error()

Эта неудачная конструкция класса QSerialPort (QProcess имеет ту же проблему) и может быть исправлена ​​в Qt 6, но не раньше этого, из-за стабильности API гарантирует Qt. В этом случае нельзя использовать синтаксисы нового стиля, поскольку они не могут использоваться, если есть слоты или перегрузки сигналов с тем же именем, но с другой подписью. Вместо этого вы должны использовать старый синтаксис.