簡體   English   中英

如何使用新語法 QT5 將信號連接到信號?

[英]How to connect signal to signal with new syntax QT5?

我正在嘗試使用新語法將信號連接到信號:

connect(ui->line,&QLineEdit::returnPressed,ui->button,&QPushButton::clicked);

但是編譯器會拋出一個錯誤,所有這些舊語法都有效:

connect(ui->line,SIGNAL(returnPressed()),ui->button,SIGNAL(clicked()));

我知道這個可以連接到 function 點擊:

connect(ui->line,&QLineEdit::returnPressed,ui->button,&QPushButton::click);

但是有沒有辦法將它連接到使用新語法的信號?

快速瀏覽一下文檔,不匹配源於clicked信號的額外參數。

一種選擇是使用 lambda 來注入該參數:

connect(ui->line,&QLineEdit::returnPressed, this, [this]() { ui->button->clicked(false); });

為此,您需要使用 lambda。 但是您的示例很好地顯示了與舊語法的混淆。 它會做什么? 它會發出真或假的信號嗎?

我確信它記錄在某處,如果沒有其他地方,那么在代碼中。 但可以肯定的是,使用新的語法,明確的,使代碼更具可讀性,對吧?

所以,如果我是你,我會寫這樣的東西:

#include <QApplication>
#include <QLineEdit>
#include <QPushButton>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    QLineEdit lineEdit;
    QPushButton pushButton;
    QObject::connect(&lineEdit, &QLineEdit::returnPressed, [&pushButton]() {emit pushButton.clicked(true);});
    return app.exec();
}

對於那些只想知道接收器是否可以是具有新連接語法的信號的人來說,答案是接收器可以是信號,而不僅僅是槽。 這就是為什么我也更喜歡稱之為“新的連接語法”而不是“新的信號/插槽語法”。 因此,發出“映射”信號的簡單信號是這樣的:

connect(
    sender, &Sender::valueChanged,
    receiver, &Receiver::valueChanged,
);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM