Upgrade to Pro — share decks privately, control downloads, hide ads and more …

被 Qt 快樂的玩弄

nctunba
June 06, 2012
340

被 Qt 快樂的玩弄

nctunba

June 06, 2012
Tweet

Transcript

  1. 安裝 Qt(5/6) 9 Development Tools • Desktop Qt • Qt

    4.8.0 (Desktop) • Desktop Qt 4.8 – MinGW Miscellaneous • MinGW 4.4 Documentation • Qt Documentation
  2.  打開你的 Qt creator  點選 File->New file or Project

    開新專案  選擇 Other project 中的 Empty Qt project  在 Name 那一欄寫上專案的名稱  不要選擇 Shadow build (別緊張,方便觀察)  next 到底! 20 DIY-1(1/3)
  3.  qmake –project  qmake  make 23 Qt 操作流程

    src/1/>ls main.cpp src/1/>qmake –project main.cpp 1.pro src/1/>qmake main.cpp 1.pro Makefile src/1/>make … src/1/>ls 1* 1.pro Makefile main.cpp main.o
  4.  Qt 可以分為兩個部分  函式庫 和 C++ 的一般的函式庫沒什麼不同  特殊功能

    使用特殊功能,需要先經過 qmake 改造! 有一些函式庫需要使用 Qt 的特殊功能 24
  5.  Qt 的函式庫非常強大!  想想 KDE 吧~  我們會先介紹 

    一些好用的巨集  一些好用的函式  一些好用的容器(container) 25 Qt 函式庫
  6.  想得到的函式前面加個 q 或 Q 即可  qrand()  qAbs()

     qSort() <- quick sort  … 29 好用函式
  7.  C++ 的容器前面加個 Q 即可  用來完全取代 C++ 的容器 

    如  QList, QVector, QMap, QSet…  QLinkedList, QStack, QQueue, QStringList… 30 容器 Container
  8.  最常用的 Container  不知道該用什麼 Container ?用 QList 就對了! 

    相容相當多種操作方式。 31 Container – QList(1/3)
  9.  size 的型態為 int  別當成 std::list  可由標準庫的 container

    轉換  QList.fromStdList()  QList.fromStdVector()  QList.fromStdSet()  … 33 Container – QList(3/3)
  10.  C++ 的格式化字串很糟?  std::cout<<a<<“ “<<b<<“:”<<a<<endl;  放心,我們還有 Qt 

    QString(“%1 %2:%1\n”).arg(a).arg(b); 35 Container – QString(2/2) 注意:QString 應該 Qt 自己的方法印出, 不能用 std::cout ,除非用 qPrintable()
  11.  這是一個關於 Qt 的非常溫馨的人倫故事。  Qt 的世界裡,每個物件都可以有自己的爸爸。  如果爸爸要死了,死前會把兒子全部殺掉。 

    若兒子要死了,死前會也通知一下自己的爸爸,免 得爸爸之後要殺死他的時候找不到人。 39 QObject(2/9)
  12.  parent and children  可說是 Qt 賦予 C++ 類似

    gc 的機制  對 Qt 來說是非常重要的機制  再重申一遍,不要被繼承搞混! 45 QObject(8/9) parent child gc: Garbage Collection
  13.  第一種做法  處處要傳訊息給顯顯,所以必須「知道」顯顯  顯顯要通知處處,所以也必須「知道」處處  第二種做法  回呼

    – 一般 GUI 框架會用的方式  第三種做法  Qt 的 signal and slot ~~ 49 QObject-Signal and Slot(3/7)
  14. signal  每個繼承自 QObject 的類別都可以有這個功能  對自己狀態的宣示  自己不需要「知道」要通知誰 50

    QObject-Signal and Slot(4/7) 處處 宣示:我處理完資料了 「我不需要知道誰會接到我資料」 「接到的人自己會去處理」
  15. slot  每個繼承自 QObject 的類別都可以有這個功能  可以接受 signal  不需要「知道」會被誰通知,只要格式ok即可

    51 QObject-Signal and Slot(5/7) 接受:我會顯示收到的資料 「我不需要知道是誰丟資料給我」 「不是顯 顯也行,誰給我,我就做」 顯顯
  16.  connect 函式  連接 signal 和 slot  讓

    signal 和 slot 建立關連  connect(sender, signal, receiver, slot) 52 QObject-Signal and Slot(6/7)
  17.  connect 函式  connect(處處, 送資料, 顯顯, 顯示資料);  connect(顯顯,

    我搞定了, 處處, 繼續處理資料) QObject::connect(processorr, SIGNAL(send(string)), displayer, SLOT(display(string)) 53 QObject-Signal and Slot(7/7) SIGNAL, SLOT 是一個巨集
  18.  Qt GUI 元件的基石  繼承自 QObject  你看得見的基本上都繼承自 QWidget

    58 QWidget(1/3) 58 parent child 接下來會用到的元件,使用前 都要先引入喔~
  19.  Widget.show()  顯示 GUI  若有兒子,也會一起顯示  建議設置完再 show

     QApplication  GUI 程式都必須包含一個  app.exec() 表進入事件循環 59 QWidget(2/3)
  20.  可以用來輸入文字  可以呼叫 text() 來取得內容 63 QLineEdit Qt 中

    getter/setter 的命名規則 setter • 會以 set 開始,以駱駝命名法命名 • e.g. setWindowTitle() getter • 一樣以駱駝命名法命名,但不加 get • e.g. windowTitle()
  21.  Resource Collection Files(.qrc)  紀錄了 Qt 應用程式所使用的資源  XML

    格式的文字檔  RESOURCE += resource.qrc 80 Resources System(2/3)
  22.  正常情形下  QFile file(“data/自己的資料”);  使用資源系統  QFile file(“:/data/自己的資料”);

    81 Resources System(3/3) <RCC> <qresource prefix=“/"> <file>data/自己的資料</file> </qresource> </RCC> 路徑可以自己指定,不一定是 真實的檔案路徑
  23.  Form.h  Form.cpp  Form.ui  Designer 的專案格式(實際上為 XML

    檔)  使用 uic 編譯,會變成 moc_form.h 檔 86 Qt Designer(5/7)
  24. 補充:Qt 的命名約定(1/2) 89  類別  應是名詞或名詞短語  class Chicken

     函式  應是動詞或動詞短語  shout()  常數全部大寫  CHICKEN  布林變數  在 if 上會近似一個句子  bool isQualified  成員變數  使用共同的前綴  m_Color, m_Width  sm_Singleton, sm_ObjCount
  25.  屬性有相應的 getters/setters 90 補充:Qt 的命名約定(2/2) 詳細的命名風格參考 Matthias Ettrich 寫的

    Designing Qt-Style C++ APIs Getter Setter • 非布林型的 getters • color() // Qt 風 • getColor() //Java 風 • 布林型的 getters • isChecked() 或 isValid() • setColor(const Color& newColor)