Qt信號與槽知識點總結歸納

一.含義與使用

(一).含義

信號與槽是qt中一種常用的通信手段。發送方發送信號,接收方通過槽進行接收並完成具體任務。

簡單來講,就是通過發送一個函數(信號),接收方通過另一個函數(槽)完成任務。

(二).connect使用

用法上,通過connect函數進行連接。

connect(發送方地址,信號函數,接收方地址,槽函數);

比如我們舉如下例子:

通過點擊按鈕實現關閉窗口。

myWidget::myWidget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::myWidget)
{
    ui->setupUi(this);
    but = new QPushButton("close", this);
    but->move(200, 200);
    //將按鈕clicked信號函數與QWidget類的close槽函數連接
    connect(but, &QPushButton::clicked, this, &QWidget::close);
}

當我們進行點擊窗口操作時,執行clicked函數進而觸發close關閉窗口。

如果使用的信號函數或槽函數有重載情況,那麼這樣直接通過地址傳函數就 不可能瞭,因為無法區別參數。

此時需要使用函數指針完成指定重載版本的調用。

舉例如下:

A* pa = new A;
B* pb = new B;
void(A::*APtr)(QString) = &A::funcA;
void(B::*BPtr)(QString) = &B::funcB;
//指定調用參數為QString的重載版本
connect(pa, APtr, pb, BPtr);

在使用connect時有幾點需要註意:

1.信號函數與槽函數的參數類型必須匹配,且信號函數參數個數可以比槽函數多,但絕對不能少。

2.一個信號函數可以連接多個槽函數

3.多個信號函數可以連接同一個槽函數

QT4之下的版本不支持這種connect形式,隻能通過如下形式使用:

connect( 發送方地址,SIGNAL( 信號函數(參數) ),接收方地址,SLOT( 槽函數(參數) ) );

SIGNAL和SLOT是宏,編譯時會將信號函數和槽函數用字符串替換,並且不會判斷參數是否相互匹配,因此隻要不是Qt版本問題,並不推薦使用這種方式。

使用disconnect可以斷開信號與槽的連接,參數與connect一致。 

(三).信號函數

如果我們自定義信號函數,有幾點需要註意:

1.信號函數需要使用signals關鍵字聲明

class A : public QObject
{
    Q_OBJECT
public:
    explicit A(QObject *parent = nullptr);
 
signals://以下均為信號函數
    void funcA();
    void funcA(QString str);
};

2.信號函數不能定義,隻用聲明即可。

3.返回值為void

4.可帶參數,可重載

5.可以使用emit關鍵字主動釋放信號觸發槽函數。

void test{
    emit A()->funcA();//使用無參版本
}

(四).槽函數

自定義槽函數也有幾點需要註意:

1.可聲明為類的任意成員函數(一般為public),較早版本必須在public slots關鍵字下聲明。

2.返回類型為void

3.可帶參數,可重載

4.可以使用lambda表達式替換

二.示例

我們寫一個程序,按鈕按下時打開一個窗口同時按鈕顯示“close”,再次按下關閉窗口按鈕變成“open”。

myWidget::myWidget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::myWidget)
{
    ui->setupUi(this);
    //設置窗口
    setFixedSize(500, 500); 
    //設置按鈕
    but = new QPushButton("open", this);
    but->move(200, 200);
    but->setCheckable(true);//如果使用toggled必須先使用該函數,clicked亦可。
 
    mw = new QWidget;//窗口
    mw->setWindowTitle("Gap");//窗口名
    //使用lambda表達式代替槽函數
    connect(but, &QPushButton::toggled, this, [&]()mutable{
        if(but->text() == "open"){
            mw->show();
            but->setText("close");
 
        }
        else{
            mw->close();
            but->setText("open");
 
        }
    });
 
    //定義一個按鈕end,按下直接關閉myWidget窗口退出程序
    QPushButton* end = new QPushButton("end", this);
    but->move(100, 200);
    connect(end, &QPushButton::clicked, this, &QWidget::close);
}

總結

到此這篇關於Qt信號與槽知識點總結歸納的文章就介紹到這瞭,更多相關Qt信號與槽內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: