日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

QT. 学习之路 一

發(fā)布時(shí)間:2025/3/18 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 QT. 学习之路 一 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

初識(shí)QT

? 一: ? hello-world:

#include "mainwindow.h" #include <QApplication> #include <QLabel> #include <qpushbutton.h> int main(int argc, char *argv[]) {QApplication a(argc, argv);//QLabel lable("hello world");QPushButton button("Quit");button.show();//lable.show();return a.exec(); }

注意:

QLabel *label = new QLabel("Hello, world");

  label 是沒辦法 delete 的這里存在著內(nèi)存泄露。

  嚴(yán)重的是,label 是建立在堆上的,app 是建立在棧上的。這意味著,label 會(huì)在 app 之后析構(gòu)。也就是說(shuō),label 的生命周期長(zhǎng)于 app 的生命周期。這可是 Qt 編程的大忌。因?yàn)樵?Qt 中,所有的 QPaintDevice 必須要在有 QApplication 實(shí)例的情況下創(chuàng)建和使用。大家好奇的話,可以提一句,QLabel 繼承自 QWidget,QWidget 則是 QPaintDevice 的子類。之所以上面的代碼不會(huì)有問題,是因?yàn)?app 退出時(shí),label 已經(jīng)關(guān)閉,這樣的話,label 的所有 QPaintDevice 一般都不會(huì)被訪問到了。但是,如果我們的程序,在 app 退出時(shí),組件卻沒有關(guān)閉,這就會(huì)造成程序崩潰。

?

二: 信號(hào)槽

  信號(hào)槽,實(shí)際就是觀察者模式。當(dāng)某個(gè)事件發(fā)生之后,比如,按鈕檢測(cè)到自己被點(diǎn)擊了一下,它就會(huì)發(fā)出一個(gè)信號(hào)(signal)。這種發(fā)出是沒有目的的,類似廣播。如果有對(duì)象對(duì)這個(gè)信號(hào)感興趣,它就會(huì)使用連接(connect)函數(shù),意思是,用自己的一個(gè)函數(shù)(稱為槽(slot))來(lái)處理這個(gè)信號(hào)。

#include "mainwindow.h" #include <QApplication> #include <QLabel> #include <qpushbutton.h> int main(int argc, char *argv[]) {QApplication a(argc, argv);//QLabel lable("hello world");QPushButton button("Quit");QObject::connect(&button, &QPushButton::clicked, &QApplication::quit);button.show();//lable.show();return a.exec(); }

QObject::connect() 有五個(gè)重載:

QMetaObject::Connection connect(const QObject *, const char *,const QObject *, const char *,Qt::ConnectionType);QMetaObject::Connection connect(const QObject *, const QMetaMethod &,const QObject *, const QMetaMethod &,Qt::ConnectionType);QMetaObject::Connection connect(const QObject *, const char *,const char *,Qt::ConnectionType) const;QMetaObject::Connection connect(const QObject *, PointerToMemberFunction,const QObject *, PointerToMemberFunction,Qt::ConnectionType)QMetaObject::Connection connect(const QObject *, PointerToMemberFunction,Functor);

connect() 函數(shù)最常用的一般形式:

connect(sender,? ?signal,?receiver, slot);

  connect() 一般會(huì)使用前面四個(gè)參數(shù),第一個(gè)是發(fā)出信號(hào)的對(duì)象,第二個(gè)是發(fā)送對(duì)象發(fā)出的信號(hào),第三個(gè)是接收信號(hào)的對(duì)象,第四個(gè)是接收對(duì)象在接收到信號(hào)之后所需要調(diào)用的函數(shù)。也就是說(shuō),當(dāng) sender 發(fā)出了 signal 信號(hào)之后,會(huì)自動(dòng)調(diào)用 receiver 的 slot 函數(shù)。

五個(gè)重載:

  第一個(gè),sender 類型是 const QObject *,signal 的類型是 const char *,receiver 類型是 const QObject *,slot 類型是 const char *。這個(gè)函數(shù)將 signal 和 slot 作為字符串處理。

  第二個(gè),sender 和 receiver 同樣是 const QObject *,但是 signal 和 slot 都是 const QMetaMethod &。我們可以將每個(gè)函數(shù)看做是 QMetaMethod 的子類。因此,這種寫法可以使用 QMetaMethod 進(jìn)行類型比對(duì)。

  第三個(gè),sender 同樣是 const QObject *,signal 和 slot 同樣是 const char *,但是卻缺少了 receiver。這個(gè)函數(shù)其實(shí)是將 this 指針作為 receiver。

  第四個(gè),sender 和 receiver 也都存在,都是 const QObject *,但是 signal 和 slot 類型則是 PointerToMemberFunction??催@個(gè)名字就應(yīng)該知道,這是指向成員函數(shù)的指針。

  第五個(gè),前面兩個(gè)參數(shù)沒有什么不同,最后一個(gè)參數(shù)是 Functor 類型。這個(gè)類型可以接受 static 函數(shù)、全局函數(shù)以及 Lambda 表達(dá)式。

?

由此我們可以看出,connect() 函數(shù),sender 和 receiver 沒有什么區(qū)別,都是 QObject 指針;主要是 signal 和 slot 形式的區(qū)別。

?

轉(zhuǎn)載于:https://www.cnblogs.com/lizhanzhe/p/10832621.html

總結(jié)

以上是生活随笔為你收集整理的QT. 学习之路 一的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。