零基礎學QT 028 Qt中的訊號與槽機制

2021-09-29 03:08:57 字數 3961 閱讀 3121

? 訊號與槽機制

訊號與槽機制(signal & slot)是qt獨創的事件響應與訊息處理機制

它允許乙個物件在觸發事件時,發出訊號,其它物件接收訊號,然後呼叫相應的槽函式進行響應處理

訊號與槽是一種形象的比喻,乙個物件發射出訊號,其它物件通過槽來接收訊號,然後處理訊號

? 訊號槽機制的使用方法

#include

#include

intmain

(int argc,

char

*ar**)

? 訊號槽機制的使用細節

qlineedit *edit;

qpushbutton *button;

qobject::

connect

(edit,

signal

(textchanged

(const qstring &))

, button,

signal

(clicked()));

qpushbutton *button;

qobject::

disconnect

(button,

signal

(clicked()

)slot

(exit()));

// directconnection,單執行緒,直接呼叫槽函式,如果有多個槽,則按連線順序依次呼叫

qobject::

connect

(button,

signal

(clicked()

)slot

(exit()

), qt::directconnection)

;// queuedconnection,將訊號放到訊息佇列中,再開乙個執行緒取訊息執行槽函式,當前執行緒立刻執行其它**

qobject::

connect

(button,

signal

(clicked()

)slot

(exit()

), qt::queuedconnection)

;// blockingqueuedconnection,將訊號放到訊息佇列中,再開乙個執行緒取訊息執行槽函式,當前執行緒等待槽執行緒執行完畢才執行其它**

qobject::

connect

(button,

signal

(clicked()

)slot

(exit()

), qt::blockingqueuedconnection)

;// autoconnection,如果發射訊號和接收訊號的**處於同乙個執行緒當中,則使用directconnection,否則使用queuedconnection

qobject::

connect

(button,

signal

(clicked()

)slot

(exit()

), qt::autoconnection)

;// uniqueconnection,如果訊號和槽已經連線過,則不再連線,這不是一種連線方式,而是一種連線選項,可以與以上四種連線方式通過位運或算來聯合使用

auto type =

static_cast

<:connectiontype>

(qt::uniqueconnection | qt::autoconnection)

; qobject::

connect

(button,

signal

(clicked()

)slot

(exit()

), type)

;

? 訊號槽機制用於普通物件訊號槽機制實際上是定義於qobject類中的功能特性

所以它不僅可以用於控制項之間的事件響應,還可以應用於任意繼承自qobject的普通qt物件

以下是乙個錢包類,當錢包裡的金錢發生變更時,會發出金錢變更的訊號,槽函式接收到這個訊號後,會列印最新的金錢數量

#ifndef wallet_h

#define wallet_h

#include

#include

using

namespace std;

class

wallet

:public qobject

;#endif

#include

"wallet.h"

wallet::

wallet

(qobject *parent)

:qobject

(parent)

void wallet::

initmoney

(long money)

void wallet::

addmoney

(long extramoney)

void wallet::

onmoneychange

(long money)

#include

"wallet.h"

intmain

(int argc,

char

*ar**)

? 快速連線訊號和槽qmetaobject提供了乙個connectslotsbyname方法,可以根據物件名和訊號函式名,自動連線對應的槽函式

比如qobject類中包含乙個名為pushbutton的成員變數,pushbutton含有乙個名為clicked的訊號函式,qobject類中包含乙個名為on_pushbutton_clicked的槽函式,通過qmetaobject::connectslotsbyname方法即可將pushbutton::clicked訊號與qobject::on_pushbutton_clicked槽連線起來

#ifndef mainwindow_h

#define mainwindow_h

#include

#include

class

mainwindow

:public qmainwindow

;#endif

#include

"mainwindow.h"

#include

mainwindow::

mainwindow

(qwidget *parent)

:qmainwindow

(parent)

void mainwindow::

on_pushbutton_clicked()

qmetaobject::connectslotsbyname所做的工作實際相當於

qobject::

connect

(pushbutton,

signal

(click)

,this

,slot

(on_pushbutton_clicked)

);

當我們通過qtdesigner設計ui介面時,我們可以右鍵選擇【go to slot】,來讓qtcreator幫我們自動生成這些**

我們只需直接在on_pushbutton_clicked方法裡面編寫**即可,這樣就大幅減少了訊號和槽的連線工作

QT零基礎學習之路

qt 學習之路 目錄 序qt 前言 hello,world 訊號槽自定義訊號槽 qt 模組簡介 mainwindow 簡介 新增動作 資源檔案 物件模型 布局管理器 選單欄 工具欄和狀態列 對話方塊簡介 對話方塊資料傳遞 標準對話方塊 qmessagebox 深入 qt5 訊號槽新語法 檔案對話方塊...

零基礎學QT 020 C 中的函式指標

函式指標 顧名思義,函式指標是指向函式的指標,通過指標便可以呼叫函式 函式指標可以指向具有相同引數列表和返回值的同類函式,這種設計,使得我們可以根據情況,呼叫不同的函式去處理相同的資料 定義和使用函式指標 void showsum int a,int b void showproduct int a...

《零基礎學Qt 4程式設計》書的內容簡介

qt 是跨平台應用程式和ui 框架,可用來編寫應用程式,無須重新編寫源 便可跨不同的桌面和嵌入式作業系統進行部署。使用qt 開發出來的軟體,已經在各行各業中得到了越來越廣泛的應用。本書內容基於最新發布的 qt 4.5 版,共分為 13章,按照qt知識結構的層次和讀者的學習規律,循序漸進 由淺入深的對...