QT4+GUI+C++閱讀筆記(Qt初中級)
1.tr("內容")函式:將內容翻譯成其他語言的標準,用於軟體改變語言。(是一種不錯的程式設計風格)。 2.在字串中用"&"來設定快捷鍵,如:"&Find"則快捷鍵為alt+f。 3.setBuddy()用來邦定夥伴 可以達到聚焦的目的。 4.setDefault(true)讓對應控制元件為預設的控制元件,即當按下Enter鍵時預設按下對應控制元件 5.sizeHint()返回一個視窗理想的尺寸大小 6.emit 執行指定訊號 7.一個訊號可以連線多個槽:在發射這個訊號的時候,會以不確定的順序一個接一個的呼叫這些槽 8.多個訊號可以連線同一個槽:不管發射哪個訊號,都會呼叫這個槽 9.一個訊號連線另一個訊號:當發射第一個訊號的時候,也會發射第二個訊號 10.連線可以用disconnect移除 11.訊號成功連線到槽,需要他們的引數必須具有相同的順序和相同的型別。有個例外,當訊號的引數比他連線的槽的引數多,那麼多餘的引數會被忽略掉 12.建立對話方塊的基本步驟: 1)建立並初始化子視窗部件; 2)把子視窗部件放到佈局中; 3)設定Tab鍵順序; 4)建立訊號與槽的連線; 5)實現對話方塊中的自定義槽; 13.圖形使用者介面(GUI)為程式提供圖片的方法: 1)把圖片儲存在檔案中,執行是載入; 2)把XPM檔案包含在原始碼中(因為XPM檔案也是有效的C++檔案); 使用Qt的資源機制; 14.Qt資原始檔是一種簡單的XML檔案格式 15.Qt通過“動作”的概念進行選單和工具欄的程式設計,一個動作就是一個可以新增任意數量的選單和工具欄上的項步驟為: 1)建立並且設定動作; 2)建立選單並且把動作新增到選單上; 3)建立工具欄並且把動作新增到工具欄上; 16.讓對話方塊以非模態(應用程式之間互不相干)的形式顯示用show、raise、activteWindow。對話方塊以模態(必須點選關閉,才能操作其他應用程式)形式顯示用exec。 17.QSplashScreen 用來在程式啟動前的啟動畫面 18.QDataStream類用於寫入和讀出二進位制流,QTextStream用於寫入和讀出文字也可以用前面的類 19.QApplication::clipboard()可以使用系統的剪貼簿 20.自定義Qt視窗或者視窗部件可以選擇一個合適的Qt類,對它進行子類化,並且通過重新實現一些虛擬函式來改變它的行為。如果想對已經存在的視窗部件的外觀進行自定義設定,那麼只需要對其應用一個樣式表或者重新實現一種定義風格即可,而不必對其進行子類化。 21.繪製事件在視窗第一次顯示的時候回自動產生,在重新調整部分或整體部件大小時回產生。也可以通過QWidget::update()或者QWidget::repaint()來強制產生繪製事件,區別是repaint會強制一個即時的重繪事件,而update是在Qt下一次處理事件時簡單的呼叫一個繪製事件,可以把多次的繪製事件壓縮在一次不會出現閃爍現象。 22.在QT設計師中使用自定義視窗部件之前必須讓QT設計師察覺到它們的存在,有兩種方法可以完成這一任務:改進法和外掛法 1)改進法是最快捷和簡單的方法,如插入一個HexSpinBox部件的步驟: a)從Qt設計師的視窗部件工具盒中拖動一個QSpinBox到窗體中建立一個QSpinBox b)右鍵單擊微調框,從上下文選單中選擇Promote to Custom Widget(改進成自定義視窗部件) c)在彈出的對話方塊中填入HexSpinBox作為類的名字,填入hexspinbox.h作為標頭檔案的名字 缺點:無法對自定義視窗部件中的那些特定屬性進行訪問,也無法對這個視窗部件自身進行繪製 2)外掛法需要建立一個外掛庫,QT設計師在執行的時候載入這個庫,並可以利用該庫建立視窗部件的例項。(由於Qt的元物件系統,QT設計師可以動態獲取它的屬性列表) 23.雙緩衝:是一種圖形使用者介面程式設計技術,它包括把一個視窗部件渲染到一個脫屏畫素對映中,以及把這個畫素映射覆制到顯示器上。當視窗部件的繪製非常複雜並且需要練血不斷地重複繪製的時候,明確的指定使用雙緩衝是非常有用的。 24.圖形處理或者圖形繪測視窗部件最好使用可以獲取的第三方視窗部件如:GraphPak,KD Chart,Qwt 25.Qt中用於視窗中擺放部件的類:QHBoxLayout、QVBoxLayout、QGridLayout和QStackLayout 26.管理窗體上子窗體部件佈局的方法有三種:絕對位置法、人工佈局法和佈局管理器法。 1)絕對位置法:通過對子窗體部件分配固定的大小和位置以及對窗體分配固定的大小來實現 缺點:a)使用者無法改變視窗的大小 b)出現大字型時會把一些文字截斷 c)對於不同的平臺會出現尺寸不合 d)必須人工計算這些位置和大小 2)人工佈局法:窗體部件位置絕對但是大小尺寸可以和視窗的大小成比例,通過重新實現窗體的resizeEvent()函式來設定部件的幾何形狀。 a)也會出現文字截斷的問題,通過考慮視窗部件的大小提示可以避免這種風險,但編碼會更復雜 3)佈局管理器法:QHBoxLayout、QVBoxLayout、QGridLayout常用的三個佈局管理器 27.QSizePolicy包含一個水平方向和一個垂直分量,通過它設定不同的取值可以設定視窗部件的大小策略 28.分組佈局:QStackedLayout類可以對一組子視窗部件進行擺放或者分頁顯示而且一次只顯示其中一個把其他的隱藏起來。 29.切分視窗:QSplitter是一個可以包含其他視窗部件的視窗部件,在切分視窗中的這些視窗部件會通過切分條而分割開。使用者可以通過拖動切分條來改變部件的大小。 30.滾動區域:QScrollArea提供了一個可視的滾動的視口和兩個滾動條。 31.停靠視窗和工具欄:QMainWindow提供了4個停靠視窗區域分別在中央視窗部件的上部、下部、左側和右側。每個停靠視窗但是QDockWidgetd的例項。 32.多文件介面:在主視窗的中央區域提供多個文件(MDI應用程式),通過把QMdiArea類作為中央視窗部件,並且通過讓每一個文件視窗都成為這個QMdiArea的子視窗部件,就可以建立一個多文件介面應用程式。setCentralWidget()設定主視窗。 33.QTimer::singleShot(0,this,SLOT(loadFiles()));在建構函式的最後設定時間間隔為0毫秒,用來呼叫loadFile()函式。意味只要建構函式結束,同時主視窗顯示出來就呼叫loadFile()函式,這樣不會因為載入檔案太大螢幕上看不任何東西。 34.程式碼編輯的元件可以用QScintilla。 35.建立事件過濾器的步驟: 1)通過對目標物件呼叫installEventFilter()來註冊監視物件 2)在監視物件的eventFilter()函式中處理目標物件的事件 36.Qt提供的5個級別的事件處理和事件過濾方法: 1)重新實現特殊的事件處理器 2)重現實現QObject::event():可以在這些事件到達特定的事件處理函式之前處理他們,如覆蓋Tab件的預設意義 3)在QObject中安裝事件過濾器:物件一旦使用installEventFilter()註冊過,就會先發送給監視物件的eventFilter()函式。安裝順序和啟用順序逆向 4)在QApplication物件中安裝事件過濾器:它可以用來處理那些傳送給失效視窗部件的滑鼠事件,因為QApplication通常都會忽略這些事件。 5)子類化QApplication並且重新實現notify() 37.處理密集時的響應保持:在程式的處理過程中因為一些事件的處理時間太長導致應用程式不能響應來著視窗的其他事件形成無法響應的狀況。這種情況的解決方法有: 1)使用多執行緒:一個執行緒來處理應用程式的使用者介面事件,將一些耗時操作用另外的執行緒來處理。 2)在耗時操作裡面頻繁的呼叫QApplication::processEvents()函式告訴Qt處理那些還沒處理的事件。 3)利用進度條提示使用者正在進行某個延時操作 4)將耗時操作推遲到應用程式空閒的時候來處理,要求該處理可以被安全中斷後繼續。在Qt中使用一個0毫秒定時器就可以實現這種方法,只要在沒有其他尚待處理的事件就可以觸發這個定時器。 38.QPainter類用於二維圖形,OpenGL是一個繪製三維圖形的標準庫。 39.想在視窗部件上繪圖需要建立一個QPainter再將指標傳到該視窗部件。QPainter的主要設定: 1)畫筆用來畫線和邊緣 2)畫刷用來填充幾何形狀的圖案 3)字型用來繪製文字 40.Qt支援三種類型的漸變:線性漸變、錐形漸變、輻射漸變。 1)線性漸變:由兩個控制點定義,連線這兩個點的線上有一系列的顏色斷點 2)輻射漸變:由一箇中心點、半徑、一個焦點以及顏色斷點定義 3)錐形漸變:由一箇中心點和一個角度定義 41.世界變換:是在視窗和視口轉換之外使用的變換矩陣,它允許移動、縮放、旋轉和拉伸。座標變換的簡單方式是使用QPainter的translate()、scale()、rotate()、shear()函式 42.qBound(0, secs, MaxSeconds)等價於if(secs < 0){secs=0}esle if(secs > MaxSecond){ secs = MacSecond} 43.在繪圖中,如果需要處理幾個到幾萬個項的時候,而且要求使用者能單擊、拖動和選取。Qt的檢視包括一個由QGraphicsScene充當的場景和一些由QGraphicsItem的子類充當場景中的項。場景以及項在檢視中顯示,它由QGraphicsView類充當。同一個場景可以在多個檢視中顯示,方便顯示一個大的場景,或者以不同的變換來顯示場景。 44.QGraphicsScene是一個圖形項的集合。一個場景有三層:背景層、項層和前景層。前景層和背景層通常由QBrush指定,但也有可能需要重新實現drawBackground()和drawForeground(),以便可以完全控制如果想用一個圖片作背景,可以簡單的建立圖片作為QBrush紋理。 45.檢視體系提供了兩種分項的方法。一種方法是簡單的使一個項成為另一個項的子項。另外一種方法是使用QGraphicsItemGroup。把一個項新增到組中不會引起任何變換,這些組可以方便的處理大量的項,就像它們是一個單獨項一樣。 46.QGraphicsView是一個視窗部件,這個視窗部件可以顯示場景,在需要的情況下可以提供滾動條,以及影響場景繪製方式的變換能力。有利於支援縮放和旋轉,幫助瀏覽場景。 47.預設情況下QGraphicsView使用Qt的內建二維圖形繪圖,可以通過setViewport()改為使用OpenGL視窗部件。 48.檢視體系使用三種不同的座標系統:視口座標、場景座標和項座標,喊包含一個座標系統對映到另一個座標的函式。視口座標是QGraphicsView的座標,場景座標是邏輯座標,用來佈置場景中的項。項座標針對某一項,並且以(0,0)點為中心。 49.QGraphicsItem不是QObject的子類,但如果需要在Link類中新增訊號和槽,可以使用QObject做多重繼承。 50.QStyleOptionGraphicsItem是Qt的有個不尋常的類,因為提供了幾個公有的成員變數,可以檢查這些狀態變數來確定節點是否被選中 51.將檢視的拖動模式設定為QGraphicsView::RubberBandDrag,以為著使用者可以通過圈選選中item 52.場景中所有被選中的Item可以通過呼叫QGraphicsScene::selectedItems()獲得 53.setDragMode(ScrollHandDrag)設定拖動模式可支援通過滑鼠拖動來滾動螢幕 54.Qt中列印的建立步驟: 1)建立一個當作繪製裝置的QPrinter 2)彈出一個QPrintDialog對話方塊,以允許使用者選擇印表機並進行設定 3)建立一個在QPrinter上操作的QPainter 4)使用QPainter繪製一頁 5)呼叫QParinter::newPage()來進行下一頁繪製 6)重複4,5直到所有頁都被列印為止 QPrinter也可以通過呼叫setOutputFormat(QPrinter::PdfFormat)來生成PDF檔案 55.在Qt中有兩種方式處理多頁文件: 1)可以把資料轉換為HTML,並且使用Qt的富文字引擎QTextDocument進行顯示 2)可以執行繪製並且手動分頁 56.使拖動生效:QWidget的dragEnerEvent()和dropEvent()函式,當用戶把一個物件拖到視窗部件上時就會呼叫dragEnterEvent(),對這個事件呼叫acceptProposedAction(),就表明使用者可以在視窗上拖放物件。當用戶放下一個物件時就會呼叫dropEvrnt()。 57.如果想拖動純文字、超文字、影象、URL和顏色,只使用QMimeData類就可以實現。但想拖動自定義資料就必須選擇如下三種方式這一。 1)使用QMimeData::setData()可以提供任意資料作為QByteArray的內容,並且在隨後利用QmimeData()提取這些資料 2)可以通過子類化QMimeData並且重新實現formats()和retrieveData()來處理自定義資料型別 3)對於在簡單應用程式中的拖放操作,可以子類化qMimeData並且利用我們所需要的任意資料結構來儲存資料 58.qobject_cast<T>():檢查是否可以成功的將一個型別的物件轉換為其他型別的物件 59.利用Qt的模型/檢視架構,我們可以從模型中獲取實際在檢視中顯示所需要的資料,這樣可以出來非常大的資料集,不會降低效能。如果決定改變底層資料集的儲存方式,則只需要修改模型 60.<QtAlgorithms>的標頭檔案聲明瞭在容器類上實現基本演算法的一套全域性模板函式 61.資料庫與tableview操作。QSqlTableModel、QSqlRelationalTableModel、QDataWidgetMapper 1)QDataWigetMapper將一個數據庫記錄欄位反映到其對映的視窗部件中,同時將視窗部件中所做出的更改反映會資料庫,自動完成,setSubmitPolicy(QDataWidgetMapper::AutoSubmit) 62.建立執行緒只需要子類化QThread並且重新實現它的run()函式就可以了 63.多執行緒中一個最基本的要求就是能實現幾個執行緒的同步操作,Qt中提供了以下幾個用於同步的類:QMutex、QReadWriteLock、QSemaphore和QWaitCondition。 1)QMutex類提供了一種保護一個變數或者一段程式碼的方法,用lock()函式來鎖住互斥量 2)QReadWriteLock是一個同步類,用在多個執行緒對共享資料進行讀寫時候的同步 3)QSemaphore是互斥量的另一種形式,可以用於保護一定數量是相同資源 4)QWaitCondition允許一個執行緒在滿足一定的條件下觸發其他多個執行緒 63.QThreadStorge<T>的一種常見用法是用於快取記憶體中,通過在不同執行緒中擁有一個獨立的快取記憶體,就可以避免用於鎖住、解鎖和可能等待一個互斥量的計算開銷 64.QObject是可重入的,但是必須記住它的三個約束條件 1)QObject的子物件必須在它的父物件執行緒中建立 2)在刪除對應的QThread物件之前,必須刪除所有在次執行緒中建立的QObject物件 3)必須在建立QObject物件的執行緒中刪除他們 65.QFtp提供了一些FTP指令,包括connectToHost()、login()、close()、list()、cd()、get()、put()、remove()、mkdir()、rmdir()、rename() 66.QHttp類是非同步工作的,可以保證使用者介面始終保持響應 67.TCP是一個基於流的協議,在TCP之上建立的高層協議通常是基於行或者基於快的 1)基於行的協議吧資料作為一行文字進行傳輸,每一資料行都以一個換行符結尾 2)基於塊的協議把資料作為二進位制塊進行傳輸,每個資料塊都是由一個大小欄位及其包含的資料組成的 68.QTcpServer的incomingConnection()函式,當有一個客戶端試圖連線到伺服器正在監聽的埠的時候就會呼叫 69.對與一般的XML資料處理,Qt提供了QtXML模板,QtXml提供了三種方式程式設計介面來讀取XML文件: 1)QXmlSreamReader是一個用於讀取格式良好的XML文件的快速解析器 2)DOM(文件物件模型)把XML文件轉換為應用程式可以遍歷的樹形結構 3)SAX(XML簡單應用程式程式設計介面)通過虛擬函式直接嚮應用程式報告“解析事件” 對於XML檔案的寫入,Qt也提供了三種可用的方法: 1)使用QXmlStreamWriter 2)在記憶體中以DOM樹的結構表示資料,並要求這個樹形結構將自己寫到檔案中 3)手動生成XML 70.工具提示、狀態提示和“What's This?”幫助 1)可以使用QWidget::setToolTip()以程式碼的形式為任意視窗部件新增工具提示: 例如:findButton->setToolTip(tr("Find next")); 2)在我們需要為一個複雜對話方塊中的每一個欄位提供說明性的文字,而不是強制使用者呼叫一個單獨的幫助視窗的時候,“What's This?”模式的針對這個問題的一個理想解決方案 例如:dialog->setEhatsThis(""); 3)利用Web瀏覽器提供線上幫助:需要考慮瀏覽器引擎是否支援 例如: void MainWindow::help() { QUrl url(directoryOf("doc").absoluteFilePath("index.html")); url.setScheme("file"); QDesktopServices::openUrl(url); } 4)將QTextBrowser作為簡單的幫助引擎 5)使用Qt Assistant提供強大的線上幫助: Qt應用程式和Qt Assistant之間通訊是由QAssistantClient類來處理的,它位於一個單獨的庫中,必須在應用程式的.pro檔案中新增如下命令列: CONFIG += assistant 6)使用與平臺相關的方法來提供線上幫助