QT對象樹、信號和槽機制

文章目錄

  • 一 、對象樹是什么?
  • 二、信號和槽的基本概念
    • 2.1 信號
    • 2.2 槽
    • 2.3 松散耦合
    • 2.4 特點
  • 三、示例
  • 總結


一 、對象樹是什么?

對象樹是由父類和若干子類對象組成,而子類也可以由若干孫類。
QT中的對象樹是以QObject為起始父類來完成樹的構建的,如下圖所示。
在這里插入圖片描述
當創建子類對象(QObject )的時候,會傳遞一個parent指針給子類的構造函數,該指針就是父對象指針。

//QWidget 為myWidget的父類
myWidget::myWidget(QWidget *parent): QWidget(parent)
{
}class myWidget : public QWidget
{Q_OBJECT
//parent 父對象指針傳遞給子類的構造函數。
public:myWidget(QWidget *parent = 0);
};

所以在創建 QObject 對象時,會提供一個父對象的指針給構造函數,QObject 對象就會自動添加到其父對象的 children() 列表。然后當父對象進行析構的時候,這個子對象列表中的所有對象都會被析構,當析構子對象的時候,會自動從父對象的子對象列表中刪除。

這種對象樹機制的優點在于析構父類的析構時,子類對象會自動銷毀,這樣就不需要關注控件內存的銷毀情況。

但也會存在特殊情況會造成QT程序內存泄漏問題,這樣就需要我們手動刪除或者調用析構函數。
1:parent指針不會區分child對象是new出來的還是從棧上分配的,如果delete棧上的內存,就會發生錯誤。避免這一情況的方法就是全部使用new來開辟空間。

2:可以嘗試采用智能指針QPointer(模板類)的方法來自動銷毀內存空間。

3:Qt的對象清理器QObjectCleanupHandler也可以自動刪除所有監視對象。

二、信號和槽的基本概念

信號槽機制類似于C#中回調函數的概念,我們知道,回調函數的本質是函數作為參數在合適的時候(條件成立時)被某一特定的事件調用的方法,而信號槽機制是如果觸發事件,對象就會發出信號給接收者,然后調用綁定的槽函數,其中相似之處在于這兩種方式都會在滿足某一條件時觸發事件,信號類似于條件達成的方法,槽函數就像被委托調用的方法。

C#是通過委托來實現函數作為參數傳遞的,信號槽機制則是通過連接的方式實現的信號和槽的綁定。

2.1 信號

信號signal也是由不同的方法組成的,例如,按鈕的信號有9種,分別繼承自三個類QAbstractButton,QWidget,QObject:
在這里插入圖片描述
分別表示點擊、按壓、松開、開關等不同狀態。
我們可以在自定義類里自定義信號:

signals://自定義信號寫到signals下//返回值是void,只需要聲明,不需要實現//可以有參數,可以重載//emit hungry();來發送信號void hungry();void hungry(QString food);

2.2 槽

槽(slot)的本質是類的成員函數,其參數可以是任意類型的,可以實現不同的功能,如關閉,隱藏,下降,上升等。例如QWidget類下槽函數包括:
在這里插入圖片描述
自定義槽:

public slots://返回值是void,需要聲明,也需要實現//可以有參數,也可以重載void eat();void eat(QString food);

2.3 松散耦合

信號和槽是松散耦合的。
松散耦合是指槽可以與信號連接(connect)在一起,只有連接的信號被激發的時候,才能調用槽函數。

2.4 特點

1:一個信號可以連接多個槽函數。多個信號也可以連接同一個槽函數。
2:信號和槽函數,參數必須一一對應。

三、示例

使用一個定時器的demo做一個簡單的示例。
定義兩個定時器,實現顯示數字的功能。

Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);//啟動定時器,每隔1s啟動一次id1 =startTimer(1000);id2 =startTimer(2000);//定時器的一種方式QTimer *timer = new QTimer(this);timer->start(500);//超時信號和顯示槽函數建立連接,timer一超時便發送一個信號setText方法遞增1connect(timer,&QTimer::timeout,[=](){static int num = 1;ui->label_3->setText(QString::number(num++));});//點擊暫停按鈕實現connect(ui->pushButton,&QPushButton::clicked,[=](){timer->stop();});
}

另外一種方法需要定義定時器的事件,用來顯示數字。

void Widget::timerEvent(QTimerEvent *event)
{//number()方法轉stringif(event->timerId() == id1){static int num = 1;ui->label->setText(QString::number(num++));}if(event->timerId() == id2){static int num2 = 1;ui->label_2->setText(QString::number(num2++));}
}

總結

對象樹和信號槽機制使QT界面功能的搭建變得簡易和靈活,缺點在于由于需要遍歷所有關聯造成性能降低。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/256085.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/256085.shtml
英文地址,請注明出處:http://en.pswp.cn/news/256085.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【數據結構】——歸并排序

目錄 一、代碼 二、隨筆 一、代碼 歸并排序的主要思路:將兩個有序的子列表歸并為一個有序的大列表 #歸并函數,假設li是由左右兩個有序的子列表組成,假設兩個子列表都是從小到大排好序的列表 def merge(li,low,mid,high)::param li: 由左右兩個有序的子列…

開發發布npm module包

開發發布npm module包 問題 在項目開發過程中,每當進入一個新的業務項目,從零開始搭建一套前端項目結構是一件讓人頭疼的事情,就要重新復制一個上一個項目的前端框架和組件代碼庫。其中很多功能的模塊組件都要重復拷貝,可以統一將…

如何使用ATS提高應用的安全性

App Transport Security,簡短的說就是ATS,是iOS9和OS X El Capitan的一個新特性。App Transport Security 的目標是提高Apple 操作系統的安全性以及在此操作系統上運行的任何應用的安全性。 基于HTTP傳輸數據的網絡請求都是明文。開啟App Transport Secu…

手機客戶端測試考慮的點

手機客戶端測試考慮點總結 版權聲明:本文為博主原創文章,未經博主允許不得轉載。 此文未本人工作中的總結,特此總結。 異常場景: 網絡異常,服務器異常,接口異常或參考參數篡改,斷電,…

NMS(非極大值抑制)算法詳解與示例

一、NMS是什么? NMS(non maximum suppression)即非極大值抑制,廣泛應用于傳統的特征提取和深度學習的目標檢測算法中。 NMS原理是通過篩選出局部極大值得到最優解。 在2維邊緣提取中體現在提取邊緣輪廓后將一些梯度方向變化率較小…

【數據結構】——冒泡排序、插入排序、選擇排序

# 冒泡排序,復雜度為O(n^2) def bubble_sorted(li:list)->list:for i in range(len(li)):# 第幾趟exchanged False# 這個是為了防止多余的遍歷,如果前面的元素已經是排序好的,那就不需要再進行比較了,減少運行時間for j in ra…

【轉載】ASP.NET應用程序與頁面生命周期

在本文中,我們將了解不同的事件,ASP.NET 應用程序的生命周期以瀏覽器向 Web 服務器(對于 ASP.NET 應用程序,通常為 IIS)發送請求為起點,直至將請求結果返回至瀏覽器結束。在這個過程中,首先我們…

基于PCL的ICP及其變種算法實現

文章目錄前言一、ICP算法基礎1.1 提取待匹配點對1.2 計算旋轉平移矩陣1.3 計算變換后的點和目標點之間的偏差二、ICP算法變種2.1 PLICP2.2 PointToPlane ICP2.3 NICP2.4 LM_ICP三、程序示例1. 傳統方法2. PointToPlane ICP總結前言 ICP(Iterative Closest Point&am…

python 計算器

--coding:utf-8-- from Tkinter import * 創建橫條型框架 def frame(root, side): w Frame(root) w.pack(side side, expand YES, fill BOTH) return w 創建按鈕 def button(root, side, text, command None): w Button(root, text text, command command) w.pack(side…

最長公共子序列(LCS)

注意最長公共子串(Longest CommonSubstring)和最長公共子序列(LongestCommon Subsequence, LCS)的區別:子串(Substring)是串的一個連續的部分,子序列(Subsequence&#x…

【數據結構】——排序算法系列總結

目錄 1、空間復雜度 2、穩定性 3、運行時間 4、目前默認的sort內置函數排序函數 5、六種常用排序方法 1、空間復雜度 空間復雜度產生的原因有兩個:①重新定義了一塊空間用于存儲數據;②遞歸產生了棧空間 冒泡排序、選擇排序、堆排序和插入排序屬于…

Spring Boot實踐教程(二):SpringApplication分析

2019獨角獸企業重金招聘Python工程師標準>>> 本文會通過分析上一篇中跑起來的示例程序來分析一下Spring Boot程序運行的基本原理。 概要 在上一篇的介紹中,程序是通過SpringBoot1HelloworldApplication.main()方法運行起來的: public static …

基于PCL的MLS(移動最小二乘)算法簡介與示例

一、MLS基礎 mls算法本質上和最小二乘一樣,是一種擬合數據的算法。區別在于mls是局部的,即通過系數向量和基函數分別對數據中不同位置的節點區域進行擬合,需要計算出全部節點域的擬合函數的參數。而傳統的最小二乘是全局的,采用所…

二分法php

二分法。分別使用while循環的方法和遞歸調用的方法。 <?php// 二分法的使用數組必須是有序的&#xff0c;或升序&#xff0c;或降序 $arr array(1, 3, 5, 7, 9, 13 );// 遞歸調用&#xff08;相比較好理解 function bsearch_r($v, $arr, $low, $high){if ($low > $high…

【JZOJ4861】【NOIP2016提高A組集訓第7場11.4】推冰塊

題目描述 Dpstr最近迷上了推冰塊。冰地是一個n行m列的網格區域&#xff0c;第i行第j列的格子記為(i,j)&#xff0c;也就是左上角為(1,1)&#xff0c;右下角為(n,m)。每個格子可能是冰面、障礙物、減速帶三者之一。其中&#xff0c;冰地外圍&#xff08;即第0行、第n1行、第0列、…

【圖像處理面試題】——1

鏈接&#xff1a;https://www.jianshu.com/p/e58ca1775700 1、給定0-1矩陣&#xff0c;求連通域。2、寫一個函數&#xff0c;求灰度圖的直方圖。3、寫一個均值濾波&#xff08;中值濾波&#xff09;。4、寫出高斯算子&#xff0c;Sobel算子&#xff0c;拉普拉斯算子等&#xff…

IT運維服務管理問題總結 #F#

1.管理現狀問題&#xff1a;支撐企業業務運行的IT系統主要由大量的網絡設備、主機系統和應用系統組成&#xff0c;這些設備和系統從應用角度來分又屬于不同的業務系統和部門&#xff0c;網絡設備、主機系統等具備獨立的用戶管理、認證授權和審計系統&#xff0c;且由不同的系統…

基于PCL的RANSAC(隨機采樣一致)算法簡介與示例

前言 RANSAC&#xff08;Random sample consensus&#xff0c;隨機采樣一致&#xff09;是3D點云擬合的一種重要的手段&#xff0c;可以對直線、圓、平面&#xff0c;圓球、圓柱等形狀的點云進行擬合&#xff0c;其優點在于可以最大程度上減少噪聲點對擬合效果的影響。 一、RA…

MATLAB調用Python自定義函數(類、函數等) Python調用MATLAB

一、MATLAB調用Python函數 參考鏈接&#xff1a;https://blog.csdn.net/qq_27280237/article/details/84644900 知乎鏈接&#xff1a;https://zhuanlan.zhihu.com/p/92081119 知乎上這位說的更加的詳細&#xff0c;感謝 二、Python調用MATLAB-API 知乎鏈接&#xff1a;htt…

Testin云測與ARM 戰略合作:推動全球移動應用加速進入中國市場

Testin云測與ARM 戰略合作&#xff1a;推動全球移動應用加速進入中國市場 2014/10/14 Testin 業界資訊&#xff08;中國北京–2014年10月14日 &#xff09;全球最大的移動游戲、應用真機和用戶云測試平臺Testin云測今日宣布與ARM建立戰略伙伴合作關系&#xff0c;設立“ARM應…