2
votes

I am trying to use the new signal and slot syntax, but I am getting a compile error at connect function. How to use the new syntax in this case?

// 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);
}

Complete error message:

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,
                               ^
1
Exactly what version of Qt and compiler and what platform are you using?Michael Burr
I am using Qt 5.4.1 and Apple LLVM version 6.1.0 @MichaelBurrRicardo

1 Answers

5
votes

The problem is that &QSerialPort::error is ambiguous:

There's the signal you're trying to connect to: QSerialPort::error(QSerialPort::SerialPortError)

But then there's also a getter with the same name: QSerialPort::error()

That's unfortunate design of the QSerialPort class (QProcess has the same problem), and might be fixed in Qt 6, but not before that, due to the API stability guarantees Qt makes. The new-style syntax connects cannot be used in this case, as they cannot be used if there are slots or signal overloads with the same name but different signature. You have to use the old syntax instead.