Qt5教程 4 帶引數訊號與槽

2022-09-18 14:21:13 字數 2380 閱讀 5308

在subwidget.h中宣告乙個signal. 和之前的訊號函式重名但是有引數:

void  backsignal(qstring);
之後在subwidget.cpp的槽函式sendsignal()中也傳送該訊號:

emit backsignal("子視窗請求返回");
在mainwidget.h中宣告乙個槽函式來響應該訊號:

void logslot(qstring);
並在mainwidget.cpp中定義該槽函式, 列印訊號傳過來的字串:

void mainwidget::logslot(qstring log)

因為使用到了qdebug, 所以需要在mainwidget.h中新增標頭檔案:

#include
下面在mainwidget.cpp中建立連線即可:

connect(&subwin, backsignal, this, &mainwidget::logslot);
如果沒有重名訊號的話, 這樣寫是沒有問題的, 但是我們現在由兩個backsignal訊號, 乙個不帶引數, 乙個帶引數, 編譯器是沒辦法區分的, 需要我們告訴它, 所以, 刪掉那兩條訊號都是backsignal的connect語句重新建立連線:

void(subwidget::*backsignal)() = &subwidget::backsignal;  // 我是沒有引數的backsignal, 叫backsignal1

connect(&subwin, backsignal, this, &mainwidget::backslot);

void(subwidget::*backsigna2)(qstring) = &subwidget::backsignal; // 我是帶乙個qstring引數的backsignal, 叫backsignal2

connect(&subwin, backsigna2, this, &mainwidget::logslot);

儲存後 ctrl + r執行, 點選back按鈕, 會輸出訊號傳送的字串:

如果用qt4的語法的話, 會十分簡單:

connect(&subwin, signal(backsignal()), this, slot(backslot()));

connect(&subwin, signal(backsignal(qstring)), this, slot(logslot(qstring)));

但是qt4這種寫法在編譯時是不進行錯誤, 也就是如果你訊號和槽函式名字寫錯了, 也是可以編譯通過的. 在執行時才會報錯. 而qt5新寫法在編譯時就會報錯, 所以qt4更簡單qt5會更安全.

mainwidget.h

#ifndef mainwidget_h

#define mainwidget_h

#include #include #include "subwidget.h"

#include class mainwidget : public qwidget

;#endif // mainwidget_h

mainwidget.cpp
#include "mainwidget.h"

mainwidget::mainwidget(qwidget *parent)

: qwidget(parent)

void mainwidget::nextslot()

void mainwidget::backslot()

void mainwidget::logslot(qstring log)

mainwidget::~mainwidget()

subwidget.h
#ifndef subwidget_h

#define subwidget_h

#include #include class subwidget : public qwidget

;#endif // subwidget_h

subwidget.cpp
#include "subwidget.h"

subwidget::subwidget(qwidget *parent) : qwidget(parent)

void subwidget::sendsignal()

QT5 訊號與槽

前言 訊號與槽是qt的精華所在,也是他區分於其他軟體的關鍵地方,所以我們學習qt肯定無法繞過這一核心 當物件內部狀態發生改變,訊號就被反射,只有定義了這個訊號的類和他的子類才能發射這個訊號 訊號的宣告是在標頭檔案中進行的,qt的signals關鍵字指出進入了訊號宣告區,隨後即可宣告自己的訊號。訊號由...

Qt5,訊號槽關聯錯誤

一 錯誤提示 error c2664 qmetaobject connection qobject connect const qobject const char const char qt connectiontype const 無法將引數 2 從 overloaded function 轉換...

訊號與槽的新語法 Qt5

在 qt5 的 qtbase staging 倉庫的 qobject connect ptr 分支中已經引入了一種全新的訊號與槽的語法。參看 new signal slot syntax possibly coming in qt 5 一文。connect slider,signal valuech...