第一章 Qt 初步實踐
- 集成開發環境: KDevelop , vim
第二章 對話框
- Q_OBJECT 啟動Qt元對象系統的一些特性,比如支持信號與槽等,它必須防止到類定義的私有區。
- QDialog 類的虛函數 virtual void accept(), 驗證對話框的返回值。
- QLineEdit::setEchoMode(), 設置編輯框對象的內容顯示方式,Normal, Password, NoEcho, PasswordEchoOnEdit,
- QVBoxLayout::setMargin(), 設置邊界
- QVBoxLayout::addStretch(), stretch 可以自由拉伸
- QString::trimmed() 移除兩端的 '\t', '\n', '\v', '\f', '\r' ' '
- QMesssgeBox::about, QMessageBox::aboutQt, QMessageBox::information, QMessageBox::question, QMessageBox::warning, QMessageBox::critical, 模態消息對話框使用父窗口的圖標,后四種對話框都具備返回值。
- QMessageBox::setDetailedText()
- 非模態對話框,必須在堆中創建。
- T qobject_cast(QObject* object); 類型T必須直接或者間接從QObject的類繼承, 並且在該類的定義里有Q_OBJECT宏變量(否則返回值是未定義的)
- QColor::isValid(), 判斷顏色對話框返回的顏色值是否有效。
- QProgressDialog::setWindowModality(Qt::WindowModal); 設置進度模態對話框的話,需要用 qApp->procesEvents() 推動事件循環
第三章 基礎窗口控件
- 一個QLabel和一個窗口部件有伙伴關系,即指當前用戶激活標簽的快捷鍵時,鼠標/鍵盤的焦點將會轉移到它的伙伴窗口部件上。只有QLabel標簽對象才可以有伙伴窗口部件,也只有該QLabel對象具有快捷鍵(在顯示文本的某個字符前面添加一個前綴“&”,就可以定義快捷鍵)是,伙伴關系才生效。
- Q_INIT_RESOURCE(hello); 初始化資源hello.qrc
- FORMS += ../../hello.ui 告訴qmake,引入文件引入 工程,通過調用setupUi()初始化和部署窗口部件。
- 多繼承情況下,Qt的類必須要放在其他類的前面,這是因為元對象編譯器假定第一個繼承類是QObject的子類,此外Qt不支持對QObject的虛繼承。
- 不同於回調函數機制,Qt提供了信號和槽機制,信號是一個特定的標識;一個槽就是一個函數,與一般的函數不同,槽函數既可以和信號關聯,也可以像普通函數一樣直接調用。當某個時間出現時,通過發送信號,可以將與之關聯的槽函數激活,即執行槽函數代碼。關聯方式:一個信號和一個槽關聯,一個信號和多個槽關聯,多個信號和一個槽關聯,一個信號和一個信號進行關聯。[Qt::AutoConnection]
- QTableWidget 與 QTableWidgetItem , insetRow(), insertItem(row, column, item)
- 信號和槽的自動關聯: void on_<窗口部件>_<信號名>_(<信號參數>);
- QWidget 提供了一些處理窗口部件的幾何布局函數,可以分為兩類:第一類,包含窗口邊框的處理函數,有x(), y(), frameGeometry(), pos() 和 move(); 第二類,有 width(), height(), geometry(), rect(), size(), resize()。
- QObject::className() 返回類名,QObject::inherits() 判斷一個對象是否是某個指定類的子類實例
- QObject::tr() 和 QObject::trUtf8(), 進行國際化的字符串翻譯
- 屬性系統基於元對象系統,通過宏Q_PROPERTY()聲明一個屬性:必須有一個讀函數;一個可選的寫函數;一個可選的重置函數,重置函數必須返回void並且沒有任何參數;一個可選的DESIGNABLE屬性,表明屬性是否在GUI構造器中可用,可寫屬性默認為true,可讀屬性默認為false;一個可選的SCRIPTABLE,表明腳本引擎是否可以訪問該屬性,可寫屬性默認為true,可讀屬性默認為false;一個可選的STORED特性,表面該屬性是否持久的,即當存儲一個對象時,是否保存該屬性的值,該特性支隊可寫屬性有意義,默認值為true。多重繼承的時候,屬性必須繼承來自第一個父類。
- Q_ENUMS(enum_type), Q_FLAGS(enum_type)
- QObject::setProperty() , QObject::property()
- Qt支持的隱式共享的類:所有容器類,QByteArray, QBitmap, QBrush, QCursor, QDir, QFont, QImage, QPen, QPalette, QPixmap, QVariant.
第四章
第五章 布局管理
- 絕對位置方式:setGeometry();手工布局方式:重載QWidget::resizeEvent(QResizeEvent*);布局管理器方式:Q*Layout。
- QWorkSpace, QDockWidget, QStackedWidget, QSplitter, QMdiArea
第六章 2D 繪圖
- drawTiledPixmap() 平鋪圖形
- QPicture 存儲QPainter 指令,將繪圖指令串行化為平台無關的格式存儲。
- Qt 支持 RGB, HSV, CMYK 顏色模型。RGB是面向硬件的模型,顏色由紅, 綠, 藍三種基本色混合而成。HSV模型則比較符合人對顏色的感覺,由色調(0 ~ 359), 飽和度(0 ~ 255), 亮度(0~255)組成。CMYK,由青,洋紅,黃,黑四種基色組成,主要用在打印機等硬拷貝設備上,每個顏色分量的取值為0~255。另外QColor還可以使用SVG1.0中定義的任何顏色名為參數初始化。
- Qt 提供了漸變填充的畫刷,漸變填充包括兩個要素:顏色的變化和路徑的變化。顏色的變化可以指定從一種顏色漸變到另外一種顏色,也可以在變化的路徑上指定一些點的顏色進行分段漸變。在Qt4中,提供了三種漸變填充:線性(QLinearGradient),圓形(QRadicalGradient),圓錐漸變(QConicalGradient)。所有類均從QGradient類繼承。其中線性見比昂指定控制點,畫刷在控制點之間進行顏色插值。圓形漸變需要指定圓心,半徑和焦點,畫刷在焦點和圓上的所有點之間進行顏色插值。圓錐漸變需要指定圓心和開始角,畫刷沿着圓心逆時針對顏色進行插值。
- 關閉窗口部件的雙緩沖:widget->setAttribute(Qt::WA_PaintOnScreen)
- Qt4 能夠支持Alpha通道。通過使用Alpha通道,可以實現半透明效果。QColor類中定義了Alpha通道的透明度,0表示完全透明,255表示完全不透明,默認情況下是完全不透明。(Qt使用的Alpha公式:color = color_src * alpha_src + color_dest * (255 - alpha_src), alpha = src_alpha)
- QBitMap 從 QPixmap 繼承,QBitMap表示單色的pixmap,主要用來創建自定義的QCursor和QBrush對象,構造QRegion對象,設置pixmap和窗口部件的掩碼。
- 當QPainter 繪制指定的字體中不存在的字符時,將繪制一個空心的正方形。
- Qt提供了4個處理圖像的類:QImage,QPixmap,QBitMap和QPicture。他們有各自的特點,QImage優化了IO操作,可以直接存取操作像素數據;QPixmap主要用來在屏幕上顯示圖像;QBitMap從QPixmap繼承,只能表示兩種顏色;QPicture是可以記錄和重放QPainter命令的類。
- QImage的顏色數據格式,QRgb 實際是無符號整形數,存儲ARGB的格式是0xAARRGGBB。32位的圖像直接存儲;單色圖像使用一位的索引指向只有兩種顏色的調色板,有兩種類型的單色圖big endian(MSB)和little endian(LSB);256色的圖使用8位索引的調色板。顏色數據有三種類型的存儲格式:RGB,ARGB和已預乘的ARGB。
第十一章 Qt 線程
- 在具有圖形用戶界面的Qt應用程序中,主線程由GUI線程充當,該線程是Qt中唯一可以進行GUI相關操作的線程,即一個具有圖形節目的Qt應用程序只能有一個GUI線程。
- GUI線程是唯一一個允許創建QApplication對象並且對它調用exec()函數的線程。
- QObject::moveToThread()函數改變QObject對象所屬的線程,但是如果這個QObject對象有父對象將無法移動,在QApplication對象創建前構造的QObject對象的thread()函數返回0,也就意味着主線程只處理這些QObject對象的posted事件,而不處理其他事件,原因是這些QObject對象不屬於任何線程。任何時候調用QApplication::postEvent()函數向任意線程創建的對象發消息,這個消息最終都會被派發到創建這個對象所屬的事件循環。
- 刪除屬於其他線程的QObject,必須使用QObject::deleteLater()函數發出一個DeferredDelete事件,並最終被目標QObject對象所屬的事件循環接受處理
- 線程本地存儲,QThreadStorage<TYPE_PTR>, 模板類,只能存儲指針,setLocalData()為調用線程存儲一份獨立的數據,這個數據通過localData()函數訪問,並且持有的數據只能是new出來的。hasLocalData()可以查詢算法已經設置了本地數據,當線程退出的時候,會自動釋放擁有的數據。
- 如果所啟動的線程中沒有事件循環,那么事件將不會發往該線程創建的QObject對象。
- QObject對象還必須遵循如下約束:QObject子對象必須在其父對象的線程中創建;事件驅動類只能用於單線程;必須保證在某個線程中創建的所有對象在該線程釋放前首先被釋放。
- 當信號的發送者和接受者分別屬於不同的現場且接受者線程存在自身的事件循環時,使用直接連接方式是不安全的。
- QtConcurrent 提供並行計算能力,QFuture類返回計算結果,提供QFutureWatcher類,監視QFuture。
第十二章 事件處理
- Qt中定義的事件是一個從QEvent類繼承而來的對象,它表示應用程序內部或外部發生了某些應用程序自身必須知道的事情。任何從QObject類派生的對象均可以通過QObject::event()方法接受事件。
- 事件處理方法,重新實現事件處理接口,類似mousePressEvent();重新實現QObject::event()函數,可以在事件到達特定的事件處理接口前處理它們;在QObject中注冊事件過濾器,目標對象中的所有事件首先發送給這個監視對象的eventFilter();在QApplication中注冊事件過濾器,如果事件過濾器被注冊到程序中唯一的QApplication對象上,應用程序中所有對象的每一個事件在它們被送達其他事件過濾器前,首先抵達這個eventFilter()函數;繼承QApplication並重新實現notify()函數,重新實現這個函數是在事件過濾器得到所有事件前獲得它們的唯一方法。
- 如果事件到達目標對象之前沒有被截獲處理,或者沒有被它的目標對象處理,那么此時,目標對象的父對象將變成新的目標對象,整個事件處理將重復進行,直到該事件被處理或者到達頂層對象。
- Qt中加快用戶界面響應通常有三種方法:第一種方法是使用線程;第二種是在處理耗時事件時頻繁調用QApplication::processEvents();第三種方法是推遲耗時事件處理,直到應用程序空閑下來。
- Qt中有一個0毫秒計時器,只要主循環中沒有未被處理的事件,這個定時器就會被觸發。
第十四章 界面風格
- QWidget::repaint() 和 QWidget::update()的區別,QWidget::repaint()函數會導致Qt立即調用QWidget::paintEvent()進行界面重繪,而QWidget::update函數不會導致人機界面的立即重繪,只有當Qt應用程序返回到主事件循環,Qt才會調度一個繪制事件。
- Qt的樣式表對大小寫不敏感,但對類名,對象名和屬性名大小寫敏感。
第十五章 XML
- Qt 支持 DOM Level 2 規范
第十六章 模型視圖結構
- Qt 的模型視圖結構分為三部分:模型,視圖和代理。模型和數據源通信,並為其他部件提供接口。視圖從模型中獲取模型索引,模型索引用來引用數據條目。在視圖中,代理負責繪制數據條目,當編輯條目時,代理和模型直接進行通信。
- 模型,視圖和代理之間通過信號和槽進行通信,其關系如下: 數據發生改變時,模型發出信號通知視圖;用戶對界面進行了操作,視圖發出信號;代理發出信號告知模型和視圖編輯器目前的狀態;
- 模型索引只是提供了臨時索引信息,因為模型可能對內部的結果進行重新組織,所以模型索引可能在下一次使用時失效。如果索引要長期引用,可以使用QPersistentModelIndex類保存模型索引。
- 如果想對模型的數據進行處理,如進行排序和過濾,可以使用代理模型。代理模型提供了模型和視圖之間的數據處理代理,使得源模型和視圖之間的數據能夠進行一些特殊的處理。Qt提供了QSortFilterProxyModel代理模型完成排序和過濾操作。
- 通常情況下,如果要使用定制的視圖,可以通過實現條目代理來完成。
- Qt使用抽象類QAbstractItemDelegate作為代理類的基類。用戶實現代理類時,至少要實現兩個純虛函數,其中,paint()函數完成繪制,sizeHint()函數返回條目的尺寸。大部分情況下,可以直接從Qt已經實現的通用QItemDelegate類繼承,以減少代碼量。
- 對於不同的數據類型,QItemDelegate提供了默認的編輯方式。也可以通過QItemEditorFactory類來注冊特定的數據類型編輯器。
十八章 進程與進程間通信
- 從Qt4.2版本引入了一項新的進程間通信技術D-Bus,並提供了相應的變成模塊QtBus。
- 常說的"進程間通信"是指有一定效率要求的通信手段,通常由操作系統內核提供支持,具體而言包括消息隊列,信號量,共享存儲,SOCKET管道(包括普通管道,流管道和命名管道)。
- 共享內存和本地Socket是實現單機進程間通信的兩種常見方法,Qt從4.4版本開始對這兩個方面進行了支持,主要包括QSharedMemory,QLocalSocket和QLocalServer類。
- D-Bus 是一種進程間通信(IPC,Inter Process Communication)和遠程調用(RPC,Remote Procedure Call)機制,最初為Linux系統開發,它用一套統一的協議替代現有系統中相互競爭的IPC方案。它的設計同樣支持系統級進行和普通用戶進程間的通信。D-Bus是一種高速的二進制消息傳輸協議,具有低延時和低開銷的特點,非常適合本機通信。