QT學習筆記點點滴滴
QT學習筆記點點滴滴是本文要介紹的內容,里面記錄了學習Qt的一切細節(jié)記錄,QT使創(chuàng)建獨立于平臺的數據庫應用成為可能。先來看本文內容。
QT的內建驅動支持Oracle,Microsoft SQL Server,Sybase Adaptive Server,IBM DB2,PostgreSQL,MySQL,BorlandInterbase,SQLite,以及各種ODBC的數據庫。QT的數據庫功能完全集成到了QT設計器中,能提供數據庫的生動的預覽。QT包括專門的數據庫組件,并且任何內建的或自定義的組件都可以數據相關;
QT普遍使用Unicode并且有良好的國際化支持。QT包括QT Linguist等工具可用來協助翻譯。應用程序可以很容易地使用和混合使用用阿拉伯語,漢語,英語,希伯來語,日語,俄語以及其他Unicode所支持的語言所寫成的文本;QT包括許多專用領域的類。比如,QT擁有包括SAX、DOM語法分析器的XML模塊。使用QT的STL兼容的集合類能夠把對象儲存在內存里面。QT的I/O類和網絡類提供使用標準協議來處理本地和遠程文件的能力
窗口部件是QWidget或其子類的實例,自定義的則通過子類化得來使用QValidator及其子類可以約束或驗證QComboBox,QLineEdit和QSpinBox。可以使用正則表達式來進行驗證
在GUI應用程序中含有QMainWindow,QMenuBar和QToolBar。在對話框中含有QMessageBox,QFileDialog,QWizard和其他對話框。布局中含有QSplitter,2D/3D圖形中含有QCanvas和QGLWidget
- BankAccount x,y;
- connect(&x,SIGNAL(balanceChanged(int)),&y,SLOT(setBalance(int)));
- x.setBalance(2450);
當x的balance被設置為2450,balanceChanged()信號被發(fā)射。這個信號被y的setBalance()槽接收,將y的balance也設置為2450
/*
如果一個Quit按鈕的clicked()信號被連接到一個程序的quit()槽,用戶就可以點擊Quit來結束這個程序。代碼可以這樣寫
connect(button.SIGNAL(clicked()),qApp,SLOT(quit()));
在QT程序執(zhí)行期間,連接可以隨時增加或撤消。
*/
菜單:PoP
每個菜單項有一個圖標、一個復選框和一個快捷鍵。菜單項通常會響應動作(比如保存)。分隔符項目顯示為一條線,用來可視化地分組相關的動作。
這是一個創(chuàng)建了New,Open,Exit菜單項的文件菜單的例子:
- QPopupMenu *fileMenu=new QPopupMenu(this);
- fileMenu->insertItem("&New",this,SLOT(newFile()),CTRL+Key_N);
- fileMenu->insertItem("&Open...",this,SLOT(open()),CTRL+Key_O);
- fileMenu->insertSeparator();
- fileMenu->insertItem("E&xit",qApp,SLOT(quit()),CTRL+Key_Q);
MenuBar:
QmenuBar實現了一個菜單欄。它自動布局在其父部件(如一個QMainWindow)的頂端,如果
父窗口不夠寬就會自動地分割而跨越多行。QT內置的布局管理器會考慮各種菜單欄。在Macintosh上面,菜單欄會如期地出現在屏幕的頂部。
這里展示了怎樣創(chuàng)建一個含有File,Edit和Help菜單的菜單欄:
- QMenuBar *bar=new QMenuBar(this);
- bar->insertItem("&File",fileMenu);
- bar->insertItem("&Edit",editMenu);
- bar->insertItem("&Help",helpMenu);
QT的菜單系統非常靈活。菜單項能夠動態(tài)地啟用,禁用,增加或刪除。通過子類化QCustomMenuItem,可以創(chuàng)建自定義外觀和行為菜單項。
下面的代碼實現了一個“Save”菜單項,一個“Save”工具欄按鈕和一個“Save”快捷鍵,并且均有氣球式幫助:
- QAction *saveAct=new QAction("Save",saveIcon,"&Save",CTRL+Key_S,this);
- connect(saveAct,SIGNAL(activated()),this,SLOT(save()));
- saveAct->setWhatsThis("Saves the current file.");
- saveAct->addTo(fileMenu);
- saveAct->addTo(toolbar);
設置:
使用QSettings類可以很容易地將用戶設置和其他程序設置保存到磁盤上。在Windows中,QSettings利用系統注冊表保存設置;在其他平臺上,設置以文本文件形式保存。
可以利用一個鍵來保存設置。例如,/SoftwareInc/Zoomer/RecentFiles鍵可能包括一個最近使用文件的列表。布爾值,數字,Unicode字符串以及Unicode字符串列表都可以保存
#p#
多線程
GUI程序通常使用多線程:一個線程保持用戶界面的響應,其他一個或多個線程做著耗時的活動比如讀取大文件或進行復雜的運算。QT可以配置為支持多線程并且提供了六個線程相關類:QThread,,QThreadStorage,QMutex,QMutexLocker,QSemaphore和QWaitCondition
2D
1.圖象
Qimage類提供了幾種格式的圖象的輸入、輸出和處理,包括BMP、GIF、JPEG、MNG、PNG、PNM、XBM和XPM
2.圖標按鈕
許多QT內建的窗口部件能夠顯示圖象,比如按鈕、標簽、菜單項等。這里是怎樣在按鈕上顯示一個圖標的方法:
- QPushButton *button=new QPushButton("&Find Address",parent);
- button->setIconSet(QIconSet(QImage("find.bmp")));
QImage支持1位,8位和32位色深的圖象。程序員可以處理象素和調色板數據,應用轉換(比如旋轉與裁剪),如果需要的話也可降低色深。為了達到某些目的(比如透明度和alpha混合),程序可以在QImage中將“alpha通道”和顏色數據保存在一起
繪畫
QPainter為繪圖部件提供了一個獨立于平臺的API。它提供各種原始的或高級的功能比如轉換和剪切。所有QT內建部件使用QPainter繪制它們自身。程序員在實現自定義部件的時候也常常使用
QPainter。Qpainter提供了一些標準函數來繪制點,直線,多邊形,橢圓,弧線和貝塞爾曲線等。下面的命令繪制了一個120×60的矩形,左上角位于(25,15),有著2個象素寬的紅色虛線輪廓:
- painter.setPen(QPen(red,2,DashLine));
- painter.drawRect(25,15,120,60);
QPainter支持使用矩形,多邊形,橢圓和位圖組成的區(qū)域的剪切。復雜區(qū)域的產生可以通過相并,相交,相減和簡單區(qū)域的異或產生。剪切可以用來減小重繪時的抖動。
QColor類存儲了一種用RGB/HSV三基色或一個名字(如“skyblue”)表示的顏色。QT程序員能
夠描述任意一個24位顏色;QT從系統調色板中自動地為程序分配所要求的顏色,在顏色受限的顯示器上則為相似的顏色。
#p#
繪圖設備
Qpainter可以在任意“繪圖設備”上操作。在任何被支持的設備上繪畫所需的代碼是相同的,設備無關的。QT支持下列繪畫設備:
一個QPixmap本質上是個“屏幕外的部件”。圖形可以先畫在一個QPixmap上,然后塊傳送到Qwidget以減小抖動。這種技術就叫“雙緩沖”。
一個QPicture是一個可以完美地縮放,旋轉和裁剪的矢量圖。QPictrue類存儲的圖象是一系列繪圖命令而不是一些象素的數據。它支持SVG(W3C's Scalable Vector Graphics)XML格式的輸入與輸出。
一個QPrinter表現為一臺物理打印機。在Windows中,繪畫命令被送到Windows打印引擎來使用已安裝的驅動。在Unix中,輸出PostScript并送往打印守護進程。
一個QWidget也是一個繪畫設備,如同前面見過的條形圖。
畫布
QCanvas提供一個2D圖形的高級接口。它能夠處理大量的畫布項目來描述直線,矩形,橢圓,文本,位圖及動畫精靈等。畫布項目很容易做成交互式的。
畫布項目是QCanvasItem子類的實例。它們比窗口部件輕巧得多,能很快的移動,隱藏和顯示。QCanvas有效地支持沖突檢測,還能羅列出指定區(qū)域中的所有畫布項目。QCanvasItem可以被子類化,用以提供自定義的項目類型或擴充已有類型的功能。
Qcanvas對象使用QCanvasView類渲染。許多QCanvasView對象可以顯示同一個QCanvas,但轉化,縮放,旋轉和裁剪各不相同
3D圖形
OpenGL是一個用來渲染3D圖形的標準API。QT開發(fā)者可以使用OpenGL在他們的程序中繪制3D圖形。這寫操作是通過子類化QGLWidget--QWidget的一個子類來完成的,使用標準的OpenGL函數而不是QPainter。Qt的OpenGL模塊在Windows、X11和Macintosh上是可用的,使用的是系統的OpenGL庫(或Mesa)。Qt開發(fā)者能夠設置一個OpenGL渲染的顯示格式:單緩沖還是雙緩沖、緩沖深度、RGBA模式還是顏色索引模式、alpha通道、裝飾層等。在顏色索引模式下,他們還可以手動設置顏色映射表。當使用QT時,開發(fā)者是在使用純粹的OpenGL。QT提供兩個方便的函數,qglClearColor()和qglColor(),能接受一個QColor參數并在任意模式下工作。
數據庫
QT的SQL模塊簡化了各種平臺上GUI數據庫程序的創(chuàng)建。程序員可以很容易地執(zhí)行SQL語句,使用專用的數據庫部件,或者創(chuàng)建數據相關的部件。Qt的SQL模塊提供了一個訪問數據庫的跨平臺接口。QT包括一些驅動,可以支持Oracle、Microsoft SQL Server、Sybase Adaptive Server、IBM DB2、PostgreSQL、MySQL、Borland Interbase、SQLite和ODBC。這些驅動可以在所有QT所支持的平臺上工作并且?guī)於际强捎玫摹3绦蚰軌蛲瑫r使用多種驅動訪問多種數據庫。
程序員可以很容易地執(zhí)行SQL語句。QT也提供一個程序員可以用來自動產生合適的SQL語句的高級C++接口。
任何QT部件(預定義的或自定義的)都可以做成數據相關的。QT也包括一些便利的數據庫專用部件,使得以窗體或表格形式顯示數據記錄的對話框或窗口創(chuàng)建起來更加簡單。數據相關的部件自動地支持瀏覽,更新和刪除記錄。大多數數據庫設計要求新紀錄具有唯一的QT猜測不到的關鍵字,所以插入操作通常需要書寫一小段代碼。程序員很容易就可以迫使用戶確認一些操作,比如刪除。QT的SQL模塊完全集成到了QT設計器中,提供了一些模板和向導使得數據庫的創(chuàng)建盡可能地快。向導能夠使用導航按鈕來創(chuàng)建和窗體,并且?guī)в懈拢迦牒蛣h除按鈕。基于QT SQL模塊的便利性,創(chuàng)建能夠使用外鍵查看,能顯示概要-細節(jié)關系并且支持數據挖掘的數據庫程序變得非常簡捷。
數據相關的窗口部件
QDataTable是一個顯示QSqlCursor結果集記錄的QTable。和QTable一樣,QDataTable支持在適當的地方編輯。通過設置QDataTable的確認屬性,程序員可以迫使用戶確認所有或已選擇的改變(比如刪除)。為每種數據類型選擇編輯器時要依賴于具體的數據類型。例如,QLineEdit適用于CHAR域,而QSpinBox適用于INTEGER域。通過對基本表創(chuàng)建一個屬性映射,程序員可以覆蓋其默認屬性,使其可以與程序員喜歡的編輯器部件類型的域(列)相配。
不必書寫任何代碼就可以更新或刪除記錄。插入操作需要一些代碼是由于大多數數據庫設計要求將要創(chuàng)建的新紀錄有唯一的碼。通過在一個與QDataTable::beforeInsert()信號相連的槽中生成碼,可以很容易完成這件事。
#p#
風格與主題
QT自動使用本機的風格作為程序外觀。QT程序會尊重用戶在顏色、字體和聲音等方面的喜好。而QT程序員可以自由地使用各種提供的風格,也可以覆蓋任意首選項。使用QT強大的風格引擎程序員可以修改已有的風格或實現自己的風格。
一種風格實現了一個特定平臺上用戶界面的外觀。一種風格是一個實現了諸如“繪制框架”、“繪制按鈕”等函數的QStyle子類。QT以最大的速度和靈活性來完成窗口部件本身的繪制
布局
布局提供了一個強大而靈活的選擇來使用固定的位置和大小。布局把程序員從程序執(zhí)行的大小和位置的計算中解放出來,并且提供了自動調整的能力以適合用戶的屏幕、語言和字體。
QT提供了布局管理器來組織父部件區(qū)域中的子部件。它們自動調整子部件的大小和位置,最小大小以及頂級部件的尺寸,并且在內容或字體改變時重新定位。QT通過布局管理器對部件布局進行了優(yōu)化。
內建布局管理器
QT的內建布局管理器有QHBoxLayout,QVBoxLayout和QGridLayout。
QHBoxLayout將其管理的部件組織在一個從左到右的水平行上。
QVBoxLayout將其管理的部件組織在一個從上到下的垂直列上。
QGridLayout將其管理的部件組織在一些網格單元中;不見可以橫跨多個單元。
自定義布局
通過子類化QLayout開發(fā)者可以定義自己的布局管理器。和QT一起提供的customlayout樣例展示了三個自定義布局管理器:BorderLayout、CardLayout和SimpleFlow,程序員可以使用并修改它們。
QT還包括QSplitter,一個最終用戶可以操縱的分離器。某些情況下,QSplitter可能比布局管理器更為可取。
為了完全的控制,通過重新實現每個子部件的QWidget::resizeEvent()并調用QWidget::setGeometry(),就可以在一個部件中手動實現布局。
事件
應用程序對象以QT事件的方式接收系統消息。應用程序能夠監(jiān)視、過濾并響應不同顆粒度的事件。在QT中,一個事件是一個繼承QEvent的對象。時間被傳遞到QObject對象以便響應它們。程序員能夠在應用程序水平和對象水平上監(jiān)視、過濾事件。
事件的產生
多數事件是窗口系統和通知部件產生的,例如,一個鍵被按下,一個鼠標按鈕被點擊,或者程序窗口被改變大小。可以計劃性地向對象發(fā)送模擬事件。存在超過50種的事件,最常用到的有MouseButtonPress、MouseButtonRelease、MouseButtonDblClick、Wheel、 KeyPress、KeyRelease、Paint、Resize和Close。開發(fā)者可以增加與內建類型行為類似的事件類型。
只知道一個鍵被按下或一個鼠標按鈕被釋放往往是不夠的。接收者還必須知道諸如哪個鍵被按下,哪個鼠標按鈕被釋放,鼠標的位置在哪里等信息。這些附加信息在QEvent的子類中是可用的,比如QMouseEvent、QKeyEvent、QPaintEvent、QResizeEvent和QCloseEvent
事件的傳遞
QT通過調用虛函數QObject::event()傳遞事件。為求方便,QWidget::event()把一些最常見的事件傳遞給了精巧的處理器,比如QWidget::mouseReleaseEvent()和QWidget::keyPressEvent()。在寫自己的部件或特殊化已有的部件時,開發(fā)者可以很容易重新實現這些處理器
文件輸入/輸出
QT為多種平臺提供了類來完成高級的輸入/輸出。QT的QTextStream類有和標準類相似的接口,并且支持QTextCodec提供的編碼。QDataStream類用于將基礎C++類型和許多QT的類型串行化微獨立于平臺的二進制格式。
XML
QT的XML模塊提供了SAX和DOM解析器,它們都可以讀取合乎語法的XML并且是無驗證的。
SAX(Simple API for XML)的實現模仿了SAX2 Java實現的設計并具有相適應的命名規(guī)則。第二級DOM(Document Object Model)的實現遵照了W3C的建議并且支持命名空間。
許多QT程序使用XML格式來保存它們的永久數據。SAX解析器用來增量式地讀取數據,對于那些解析需求較低或者包含在超大型文件中的應用程序非常合適。DOM解析器讀取整個文件并在內存中生成一棵可隨意遍歷樹
進程間通信
QProcess用來啟動一個外部程序并且用一種平臺無關的方式來與它們通信。通信是通過寫入外部程序的標準輸入和讀取它們的標準輸出或標準錯誤來完成的。
QProcess以異步方式工作,以發(fā)射信號的方式來報告數據的可用性。QT程序連接到這些信號來取回并處理數據,也可以發(fā)送數據到這些外部程序來表示響應
網絡
QT提供了多種平臺的接口來編寫TCP/IP客戶端和服務器,支持IPv4和IPv6。
QSocket類提供了一個異步帶緩沖的TCP連接。QSocket是一個QIODevice,使得在一個套接字上面使用QTextStream和QDataStream變得非常容易
集合類
集合類用來在內存中存儲項目組。QT提供了一系列與標準模板庫(STL)兼容的類,無論編譯器是否支持STL都可以工作。
應用程序常常需要管理內存中的項目,例如成組的圖象、部件或自定義的部件。許多編譯器支持STL,STL提供了現成的數據結構來存儲項目。QT提供了線性表、棧、隊列和STL語法的字典。QT的集合類能與STL和非STL編譯器協同使用。
QT豐富而方便的集合類(“容器”)和相關的迭代器在內部被大量使用,并且成為了QT API的一部分。QT的容器使用“私有類”和“隱含共享”兩種技術來優(yōu)化速度和內存效率。程序員也可以在支持的平臺上使用STL容器,代價是是去了QT的優(yōu)化。
模板類常常會顯著增加可執(zhí)行文件的大小,因為編譯器會為各種特殊類型生成相同的代碼。QT的模板集合類減少了代碼的膨脹,因為它們只是非模板私有類上的一個薄層
插件和動態(tài)鏈接庫
QT能夠訪問動態(tài)鏈接庫中與平臺無關的函數。QT還支持插件,插件允許開發(fā)者以獨立組件方式創(chuàng)建、分發(fā)編解碼器、數據庫驅動、圖象格式轉換器、風格和自定義窗口部件
1.插件
將QT便解碼器、圖象格式轉換器、風格或者自定義窗口部件轉換為插件是通過子類化合適的插件基類,實現一些函數并增加一個宏來完成的
2.動態(tài)鏈接庫
QLibrary類提供了各種平臺的動態(tài)庫裝入,這是一種比拘束得多的構建時連接強大得多的機制
小結:QT學習筆記點點滴滴的內容介紹完了,這篇文章可以說是很詳細了,在我們學習QT的過程中會碰到的每個問題,最后希望本文對對你有所幫助吧!!!