Qt5 connect 重載信號和槽


轉載文章超哥的經驗之談---Qt5 connect使用之“重載信號和槽”

Qt4中,關聯信號與槽是要使用到SIGNAL()SLOT()這兩個宏。

QLabel *label = new QLabel;
QScrollBar *scrollBar = new QScrollBar;
QObject::connect(scrollBar, SIGNAL(valueChanged(int)),
                 label,  SLOT(setNum(int)));

但是Qt5中更改了寫法

QLabel *label = new QLabel;
QLineEdit *lineEdit = new QLineEdit;
QObject::connect(lineEdit, &QLineEdit::textChanged,
                 label,  &QLabel::setText);

上面兩種寫法都是沒有任何問題,都可以實現關聯信號和槽。

Qt4中,因為是會制定信號和槽的參數類型,所以就不會發生不知道調用哪個槽或者信號的問題,但是在Qt5中,如果你遇到了重載的信號或者是槽,該如何指定想要調用的信號或者槽呢?

比如QComboBox這個類,這是別人舉例的這個,我寫下這個的時候,這個類的信號沒有這個重載了。

這是之前的:

void QComboBox::currentIndexChanged(const QString &text)

void QComboBox::currentIndexChanged(int index)

Qt5.15.2的時候已經改變了,我個人覺得,這個可能是官方有意避免這種重載的寫法。

QComboBox Class : Signals

void activated(int index)
void currentIndexChanged(int index)
void currentTextChanged(const QString &text)
void editTextChanged(const QString &text)
void highlighted(int index)
void textActivated(const QString &text)
void textHighlighted(const QString &text)

QComboBox::currentIndexChanged 信號有以上兩種重載, 分別參數為字符串類型和整型。
下面以字符串類型參數為例:

auto *comboBox = new QComboBox;
auto *label    = new QLabel;

// ① 基於字符串匹配 connect
connect(comboBox, SIGNAL(currentIndexChanged(const QString&)),
    label, SLOT(setText(const QString&)));

// ② 基於方法地址匹配 connect. 使用 static_cast 實現
connect(comboBox,
    static_cast<void(QComboBox::*)(const QString&)>(&QComboBox::currentIndexChanged),
    label, &QLabel::setText);

// ③ 基於方法地址匹配 connect, 使用 方法地址 實現
void(QComboBox::*curChangeSiganl)(const QString&) = &QComboBox::currentIndexChanged;
connect(comboBox, curChangeSiganl, label, &QLabel::setText);

除了以上三種實現方式, Qt 也有自己的實現方式: qOverload

// ④ 基於方法地址匹配 connect, 使用 QOverload 實現
connect(comboBox, QOverload<const QString&>::of(&QComboBox::currentIndexChanged),
    label, &QLabel::setText);

// ⑤ 基於方法地址匹配 connect, 使用 qOverload 實現. 需要 支持 C++14
connect(comboBox, qOverload<const QString&>(&QComboBox::currentIndexChanged),
    label, &QLabel::setText);

qOverload

上面的案例 ④⑤ 是qOverload的基礎語法使用。
qOverload 的作用是返回重載函數的指針,模板參數為函數類型列表

struct Foo {
    void overloadedFunction();
    void overloadedFunction(int, const QString &);
    void overloadedFunction(int, const QString &) const;
};
... qOverload<>(&Foo::overloadedFunction)
... qOverload<int, const QString &>(&Foo::overloadedFunction)

針對const 重載, 可以使用**qConstOverloadqNonConstOverload**

... qConstOverload<int, const QString &>(&Foo::overloadedFunction)
... qNonConstOverload<int, const QString &>(&Foo::overloadedFunction)

qOverload 需要 C++14 支持. 針對 C++11, 可以使用 QOverloadQConstOverloadQNonConstOverload 輔助類

... QOverload<>::of(&Foo::overloadedFunction)
... QOverload<int, const QString &>::of(&Foo::overloadedFunction)

... QConstOverload<int, const QString &>::of(&Foo::overloadedFunction)
... QNonConstOverload<int, const QString &>::of(&Foo::overloadedFunction)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM