一、概述
1、QT
QT是一個c++的第三方庫,是專門用來進行界面編程的一個庫
1. QT本身實現了多種軟件:
2. ubuntu系統中所有界面都是QT做的
3. 最新版本的QQ也是QT做的
4. 嵌入式編程中,幾乎所有的上位機,都可以使用QT來做
QT本身除了實現了ui界面編程之外,還實現了很多非ui界面編程的功能????????
網絡通信、藍牙通信、串口通信、web瀏覽器顯示等等等等
基本上來說,現實生活當中可能需要用到的功能,都能用QT來實現
1、QT的手冊怎么查詢
在左側功能欄,點到幫助,將目錄改成索引,可以通過搜索欄查找要查找的類
最上面一欄是內容欄,列出了這個類中所包含哪些東西(單擊綠色的文字可以跳轉到目標)
第二個是類的屬性欄,列出了類的基類,頭文件等等
2、關于QT的頭文件
QT的所有頭文件,都會以 Q 開頭,后面的所有單體,以駝峰命名法,命名
#include <QDebug>
#include <QApplication>
#include <QLabel>
#include <QWidget>
#include <QLineEdit>
#include <QTextEdit>
#include <QPalette>
#include <QPushButton>
3、關于編譯執行后的輸出方式
在編輯這一欄,中可以看見項目工程文件,工程文件中有一個和工程文件同名的.pro文件,該文件中的是工程文件的編譯和查找方式(就像Makefile)。
在屏幕下方的提示欄輸出:
QT += core guigreaterThan(QT_MAJOR_VERSION, 4): QT += widgetsCONFIG += c++11
DEFINES += QT_DEPRECATED_WARNINGS
SOURCES += \main.cpp \HEADERS += \FORMS += \qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target
重新彈出終端文本框輸出(自帶的):
TEMPLATE = app
CONFIG += console c++11
CONFIG -= app_bundle
CONFIG -= qtSOURCES += main.cpp
二、QT的一些基礎的函數
1、qDebug(用來debug)
格式:#include <QDebug>qDebug() << 要輸出的目標;
功能:該函數返回一個QT的標準輸出流對象
解析:QDebug類型對象,直接將該類型對象理解成 cout 就行了
三、QT界面類
1、QWidget(窗口類)
#include <QWidget>
構造函數:QWidget(QWidget *parent = Q_NULLPTR, Qt::WindowFlags f = Qt::WindowFlags())
QWidget是一個窗口類
注意:QWidget創建的對象只有一個窗口,不能輸入,不能顯示文字,一般用于輔助布局QWidget這個窗口類的作用就是用來實現大界面的框架,底盤,用來承載其他各種各樣的子界面
2、QLabel(文本框)
#include <QLabel>
構造函數:QLabel(QWidget *parent = Q_NULLPTR, Qt::WindowFlags f = Qt::WindowFlags())QLabel(const QString &text, QWidget *parent = Q_NULLPTR, Qt::WindowFlags f = Qt::WindowFlags())
功能:這是一個文本框,只能顯示編譯的文本,不能通過文本框輸入文本
成員方法:1.setText(設置文本內容)2.clear(清空文字)······
3、QLineEdit(行編輯文本框)
#include <QLineEdit>
構造函數:QLineEdit(QWidget *parent = Q_NULLPTR)QLineEdit(const QString &contents, QWidget *parent = Q_NULLPTR)
功能:這是一個行編輯器,可以進行一行的文本編輯
成員方法:1.setText(設置文本內容)2.setPlaceholderText(設置提示文字)3.setEchoMode(設置顯示方式)4.setPalette(QPalette pe);(設置成調色板配置的顏色)······
4、QTextEdit(文本編輯文本框)
#include <QTextEdit>
構造函數:QTextEdit(QWidget *parent = Q_NULLPTR)QTextEdit(const QString &text, QWidget *parent = Q_NULLPTR)
成員方法:1.setText(設置文本內容)2.append(換行并追加文字)3.setPlaceholderText(設置提示文字)4.setEchoMode(設置顯示方式)5.setPalette(QPalette pe);(設置成調色板配置的顏色)······
5、QPalette(調色板)
#include <QPalette>
構造函數:(還有的其他的構造函數可以自己查找)QPalette()QPalette(const QColor &button)
成員方法:1.setColor(設置調色板的顏色)······
6、對象樹
對象樹是QT的核心機制之一
QT中絕大多數的類都繼承自一個基類QObject,繼承自同一個基類的好處是方便多態
QObject有一個重要的分支派生類:QWidget,結構圖如下
7、父子對象,父子組件
1)父子組件的關系
在對象樹中,在此繼承關系下,所有的刺激組件都可以將他的上一級或同級的對象,設為父組件
多個子窗口設置同一個窗口為父組件,組成父子組件后,有以下優點:
父子組件是一個整體,子組件是父組件的一部分,父組件的顯示、關閉、移動操作,子組件也會同步執行。
由于子組件是父組件的一部分,所以子組件的生命周期由父組件自動管理,當父組件析構時,父組件也會自動調用子組件的析構函數。
2)如何設置父子組件
Qobject的所有派生類中都有一個默認參叫做parent,就比如下圖的這些構造函數,在構造對象時傳入具體的窗口對象,就可以將其設置為自己的父組件。
如下圖,就可以將qw設置為ql的父組件。
8、QBoxLayout(布局類)
布局類有兩個派生類:
分別是:QHBoxLayout(水平派生類)和 QVBoxLayout(垂直派生類)
1)QHBoxLayout(水平派生類)
#include <QHBoxLayout>
構造函數:QHBoxLayout(QWidget *parent)
成員函數:addWidget(添加組件到布局中)
2)QVBoxLayout(垂直派生類)
#include <QVBoxLayout>
構造函數:QVBoxLayout(QWidget *parent)
成員函數:addWidget(添加組件到布局中)
3)setLayout(設置窗口的布局)
#include <QWidget>
void QWidget::setLayout(QLayout *layout)
練習:發送消息界面
四、信號和槽
1、信號
當一個組件發生人為操作 、狀態發生改變的時候,就會發出一個對應的信號,用來通知外部,當前組件發生了什么
為什么要通知外部當前組件發生了什么:被通知的外部,一旦捕獲到信號,就可以做出對應的處理
例如:
點擊按鈕 >> 按鈕發出clicked信號 >> 外部捕獲clicked信號 >> 做出對應操作(如發送消息,關閉窗口等操作)
QT中的信號可以攜帶參數:
目的在于:通知外部當前組件發生了什么操作的時候,還可以通過參數的形式,將一些必要的數據發送給外部
2、槽
用來處理信號的一個函數
當外部 或者 特定組件,捕獲到信號之后,就會調用對應的槽函數,來處理該信號
點擊按鈕 >> 按鈕發出clicked信號 >> 外部捕獲clicked信號 >> 做出對應操作,這里對應的操作,其實就是槽函本身
由槽函數來實現對應的操作
QT中的槽函數由2個特點:
槽函數允許用戶直接手動調用,這個時候,槽函數的參數,直接由用戶手動傳入即可
槽函數同時允許通過信號函數觸發,這個時候,槽函數的參數來自于信號的參數,即信號發出的同時,通過參數發出了一組數據,該數據由對應的槽函數的參數接受
3、connect(關聯信號和槽)
QObject::connect(發出信號的組件的地址,信號函數指針,接受信號的組件地址,槽函數指針)
功能:將指定的信號和指定的槽關聯,當發出信號后,就執行槽函數
參數:發出信號的組件的地址:組件地址信號函數指針:&信號所屬的類名::信號函數名接受信號的組件地址槽函數指針: &槽函數所屬的類名::槽函數名
4、信號和槽的可關聯性
就是信號和槽之間的關聯需要滿足一個的條件:
如果槽函數有一個形參,那么與之關聯的信號就必須在相同位置傳遞一個實參;
如果信號有一個實參要傳遞,但是槽函數沒有形參接收則沒關系。
5、自定義信號和槽
1)自定義槽函數
我們可以給自定義的窗口寫自定義槽函數
自定義槽函數可以寫在 public 中,也可以寫在 public slots?中,寫在 public slots 中更規范
2)自定義信號
必須寫在訪問限制符 signals 下
自定義信號只需要聲明不需要定義
3)如何觸發自定義信號
調用信號函數:emit 信號函數名();
注意,如果使用了自定義信號,需要滿足以下3個要求1.使用自定義信號的類,必須直接或者間接的繼承自 QObject,也就是這個類必須是對象樹中的成員之一2.必須在使用了自定義信號的類的一開頭,寫上一個關鍵 Q_OBJECT3.使用自定義信號的類,必須分文件寫法,不能和 main 在同一個文件中
6、connect的多種使用方式
1)關聯某個對象的信號和槽
QObject::connect(btn,&QPushButton::clicked,this,&Widget::myslot);
2)將某個對象的信號與lambda
QObject::connect(ui->pushButton,&QPushButton::clicked,[=](){QString str = ui->lineEdit->text();ui->textEdit->append(str);ui->lineEdit->clear();
});一般說,這是我們最經常使用的方法
因為 lambda表達式能夠捕獲父作用域中所有內容:包括ui以及其他的私有成員
非常好用
3)將某個對象的信號與關聯函數關聯
void func(){qDebug() << "hello world";
}QObject::connect(ui->pushButton,&QPushButton::clicked,func);
一般來說,我們很少讓一個信號關聯到全局函數
因為全局函數無法訪問ui
4)將對象的信號關聯到另一個信號
QObject::connect(ui->pushButton_2,&QPushButton::clicked,ui->pushButton,&QPushButton::clicked);
由一個信號觸發另一個信號
這個也很好用,但是目前來說用不上
7、轉到槽功能
轉到槽功能,會自動生產一個與目標組件,所選擇的信號關聯好的槽函數。
轉到槽有局限性:只有ui界面里面的組件能夠使用轉到槽,ui界面中不能顯示的窗口無法使用轉到槽。
1. 雙擊 .ui 文件
2. 繪制界面
3. 轉到槽(在Widget文件中添加槽函數)
4. 添加的槽函數
練習:發送消息
基于發送消息界面的練習,制作發送消息的顯示,點擊 "發送" 按鈕之后,將le中的文字,同步到te上去,
并且刪除le中的文字點擊 "發送" 按鈕后,觸發按鈕的 clicked 信號
1:獲取并記錄lineEdit的文字
2:將記錄的文字設置到textEdit上面去
3:清空lineEdit上的文字