2

新しいシグナルとスロットの構文を使用しようとしていますが、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,
                               ^
4

1 に答える 1

6

問題は&QSerialPort::errorあいまいであることです:

接続しようとしている信号があります: QSerialPort::error(QSerialPort::SerialPortError)

しかし、同じ名前のゲッターもあります: QSerialPort::error()

これは QSerialPort クラスの残念な設計 ( QProcessにも同じ問題があります) であり、Qt 6 で修正される可能性がありますが、Qt が保証する API の安定性のため、それ以前には修正されません。この場合、新しいスタイルの構文 connect は使用できません。名前が同じで署名が異なるスロットまたはシグナル オーバーロードがある場合は使用できないためです。代わりに古い構文を使用する必要があります。

于 2015-06-12T16:32:15.110 に答える