QT. 学习之路 一
初識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 的這里存在著內存泄露。
嚴重的是,label 是建立在堆上的,app 是建立在棧上的。這意味著,label 會在 app 之后析構。也就是說,label 的生命周期長于 app 的生命周期。這可是 Qt 編程的大忌。因為在 Qt 中,所有的 QPaintDevice 必須要在有 QApplication 實例的情況下創建和使用。大家好奇的話,可以提一句,QLabel 繼承自 QWidget,QWidget 則是 QPaintDevice 的子類。之所以上面的代碼不會有問題,是因為 app 退出時,label 已經關閉,這樣的話,label 的所有 QPaintDevice 一般都不會被訪問到了。但是,如果我們的程序,在 app 退出時,組件卻沒有關閉,這就會造成程序崩潰。
?
二: 信號槽
信號槽,實際就是觀察者模式。當某個事件發生之后,比如,按鈕檢測到自己被點擊了一下,它就會發出一個信號(signal)。這種發出是沒有目的的,類似廣播。如果有對象對這個信號感興趣,它就會使用連接(connect)函數,意思是,用自己的一個函數(稱為槽(slot))來處理這個信號。
#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() 有五個重載:
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() 函數最常用的一般形式:
connect(sender,? ?signal,?receiver, slot);connect() 一般會使用前面四個參數,第一個是發出信號的對象,第二個是發送對象發出的信號,第三個是接收信號的對象,第四個是接收對象在接收到信號之后所需要調用的函數。也就是說,當 sender 發出了 signal 信號之后,會自動調用 receiver 的 slot 函數。
五個重載:
第一個,sender 類型是 const QObject *,signal 的類型是 const char *,receiver 類型是 const QObject *,slot 類型是 const char *。這個函數將 signal 和 slot 作為字符串處理。
第二個,sender 和 receiver 同樣是 const QObject *,但是 signal 和 slot 都是 const QMetaMethod &。我們可以將每個函數看做是 QMetaMethod 的子類。因此,這種寫法可以使用 QMetaMethod 進行類型比對。
第三個,sender 同樣是 const QObject *,signal 和 slot 同樣是 const char *,但是卻缺少了 receiver。這個函數其實是將 this 指針作為 receiver。
第四個,sender 和 receiver 也都存在,都是 const QObject *,但是 signal 和 slot 類型則是 PointerToMemberFunction。看這個名字就應該知道,這是指向成員函數的指針。
第五個,前面兩個參數沒有什么不同,最后一個參數是 Functor 類型。這個類型可以接受 static 函數、全局函數以及 Lambda 表達式。
?
由此我們可以看出,connect() 函數,sender 和 receiver 沒有什么區別,都是 QObject 指針;主要是 signal 和 slot 形式的區別。
?
轉載于:https://www.cnblogs.com/lizhanzhe/p/10832621.html
總結
以上是生活随笔為你收集整理的QT. 学习之路 一的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java的新项目学成在线笔记-day10
- 下一篇: 十天冲刺之四