回顧:
1.QT的編譯
qmake使用
*.pro檔案格式
2.QT的工具
協助文檔
組態工具
UI設計器
3.QT的類的使用
一.訊號與槽
1.背景:
面向過程
模組之間低耦合設計(高內聚).
函數調用:
直接調用
回調調用
物件導向
模組之間低耦合設計(高內聚).
對象調用
直接調用
介面調用
QT:
訊號與槽解決問題:
對象的成員變數的調用?
對象的成員函數的調用?
案例:
表單,有一個文字框。
線程,每隔一秒改變文字框。
問題:
線程類訪問表單組件比較麻煩,需要傳遞。
在QT中,使用線程程式可能不工作。
2.使用訊號與槽
最大的好處,不通過參數傳遞,直接調用對象。
以及在對象之間傳遞資料
2.1.頭與實現必須分開。
2.2.必須繼承QObject
2.3.被調用函數成為槽slot
2.4.調用函數成為訊號
2.5.必須在類引入QObject中一個宏
2.6.實現與C++完全一樣。
2.7.訊號與槽的傳回值必須是void
2.8.關聯的訊號與槽原型必須一致,名字可以不同
View Code
//log.h#ifndef LOG_H#define LOG_H#include <QObject>class Log : public QObject //定義槽函數必須繼承QObject{Q_OBJECTpublic slots: void log(); //定義一個槽函數。槽函數是被調用的函數};#endifView Code
//log.cpp#include <log.h>#include <iostream>using namespace std;void Log::log() //槽函數的實現{ cout <<"call log!"<<endl;}View Code
//biz.h#ifndef BIZ_H#define BIZ_Hclass BIz : public QObject{Q_OBJECTpublic: void biz(); //用這個函數調用siglog函數,siglog函數就是訊號函數public:signals: void siglog(); //定義訊號函數。訊號函數是調用槽函數的函數}#endifView Code
//biz.cpp#include <iostream>#include <biz.h>using namespace std;void Biz :: biz() //實現biz函數,在函數中調用訊號函數{ sleep(1); cout<<"tackle biziness!"<<endl; emit siglog(); //訊號函數的調用}View Code
//main.cpp#include <biz.h>#include <log.h>int main(){ Log log; Biz biz; QObject::connect( //串連訊號與槽 &biz, SIGNAL(siglog()), &log, SLOT(log()) ) biz.biz(); //調用biz}
思考:
訊號與槽在對象耦合上有什麼優點?
3.QT可視化組件(控制項)
其中的訊號是怎麼發出的?
訊號是自動發出.
案例:
使用按鈕的訊號.
按鈕事件發生的時候發出訊號.
事件->訊號->槽
訊號與槽解決如下問題:事件發生的時候,怎麼調用使用者的函數?
新的類:
QMessageBox提供一組靜態函數彈出對話方塊
步驟:
1.main.cpp
2.*.pro
3.對話方塊類
4.實現按鈕clicked訊號的對應槽函數
槽函數必須與clicked訊號同型,
槽函數在哪個類定義?槽函數放入訪問成員最多的類
5.綁定訊號與槽
View Code
//mydialog.h#ifndef MY_DIALOG_H#define MY_DIALOG_H#include <QDialog>#include <QPushButton>class MyDialog : public QDialog{Q_OBJECTprivate: QPushButton *btn; public: MyDialog(QWidget *parent=NULL); ~MyDialog();public slots: void showBox(); };#endifView Code
//mydialog.cpp#include "mydialog.h"#include <iostream>#include <QMessageBox>using std::cout;MyDialog::MyDialog(QWidget*parent){ resize(400,300); btn=new QPushButton(this); btn->resize(100,30); btn->move(150,150); btn->setText("OK"); connect(btn,SIGNAL(clicked()), this,SLOT(showBox()));}MyDialog::~MyDialog(){ delete btn;}void MyDialog::showBox(){ QMessageBox::information(this,"Information","this is maomaochong!");}View Code
//main.cpp#include <QApplication>#include "mydialog.h"int main(int s,char**v){ QApplication app(s,v); MyDialog dlg; dlg.setVisible(true); return app.exec(); }
案例2:
加法器
1.設計介面(*.ui,*.h)
2.main.cpp
3.pro
4.對話方塊
5.處理訊號與槽
設計好介面後,儲存為frmdlg.ui檔案。然後在終端對應檔案夾下
uic frmdlg.ui -o frmdlg.h
產生介面的標頭檔。
View Code
//dlgjfq.h#ifndef DLG_JFQ_H#define DLG_JFQ_H#include <QDialog>#include "frmjfg.h"class DlgJFQ : public QDialog{Q_OBJECTprivate: Ui_DlgJFQ *ui;public: DlgJFQ(QWidget *parent=NULL); ~DlgJFQ();public slots: void add(); };#endifView Code
//dlgjfq.cpp#include "dlgjfq.h"DlgJFQ::DlgJFQ(QWidget *parent){ ui=new Ui_DlgJFQ; ui->setupUi(this); connect(ui->btnAdd,SIGNAL(clicked()), this,SLOT(add()));}DlgJFQ::~DlgJFQ(){ delete ui;}void DlgJFQ::add(){ //取字串 QString strAdded=ui->txtAdded->text(); QString strAdd =ui->txtAdd ->text(); //轉換為整數 int ia=strAdded.toInt(); int ib=strAdd.toInt(); //計算和 int ic=ia+ib; //把和轉換為文本顯示到標籤框 ui->lblResult->setText(QString::number(ic));}View Code
//main.cpp#include <QApplication>#include "dlgjfq.h"int main(int args,char**argv){ QApplication app(args,argv); DlgJFQ dlg; dlg.show(); return app.exec();} View Code
//main.proTEMPLATE=appSOURCES=main.cpp \ dlgjfq.cpp HEADERS=frmjfg.h \ dlgjfq.h CONFIG=release qtQT=core guiTARGET=main
二.QT類的繼承結構
QT的類
core
資料集合
QString
幾何類
QPoint
QSize
QRectangle
系統類別
QColor
QFont
QImage
QIcon
QCursor
QBitmap
...
gui
表單類
|-架構表單 QMainWindow(SDI/MDI)[菜單/工具條/狀態條/帶文檔與視圖]
|-對話方塊表單QDialog[強制回應對話方塊/非模式]
組件
顯示組件
輸入組件
按鈕
容器
菜單
布局組件
進階資料群組件
表格/樹型
三.表單類的結構
QObject QPaintDevice
|------|-------|
QWidget
|
|--------------------|------------------|
QMainWindow QDialog 控制項
QObject:
非靜態
connect
disconnect
靜態
connect
disconnect
tr
維護子物件的關係
定時器事件
訊號:
destroy.
QPaintDevice(所有可視化控制項都是繪製裝置)
可視化組件高度height() width();
螢幕解析度等相關資訊
QWidget
常規屬性
幾何屬性:
表徵圖
游標
標題
基本事件(繪製/滑鼠事件/鍵盤事件)
作業:
1.閱讀隨機數程式.
注意:線程封裝
訊號與槽
2.寫匯率計算機
3.思考:
訊號與槽的使用特色與優點.