linux進階編程day14 筆記

來源:互聯網
上載者:User

回顧:
  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();  //定義一個槽函數。槽函數是被調用的函數};#endif
View 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();  //定義訊號函數。訊號函數是調用槽函數的函數}#endif
View 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();        };#endif
View 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();        };#endif
View 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.思考:
    訊號與槽的使用特色與優點.

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.