QT提供了設計師工具,可以很方便的使用鼠標拖拽的方式繪制界面。繪制完畢后自動生成一個界面的.h文件(如ui_mainwindow.h),其中含有一個自動生成的Ui_MainWindow類,這個類中核心的函數是setupUi,根據界面向導的不同里面接收一個QWidget *參數或者QMainWindow *參數。這個函數會自動在傳入的QWidget或QMainWindow上根據設計師繪制的界面創建可視化控件。使用這個自動生成的類有兩種方式,一是在定義QWidget或QMainWindow時創建一個Ui_MainWindow類型的成員ui,在構造函數中調用其setupUi方法ui.setupUi(this),或使用C++特有的多繼承方式,定義子類的時候同時以Ui_MainWindow作為基類,在構造函數中直接調用setupUi(this).這時已經可以在自定義部件子類中顯示繪制的界面了。要訪問繪制界面的可視化控件,根據上述兩種方式使用ui->控件名稱或者控件名稱直接進行引用即可。
這時顯示已經沒問題了,我們還需要設置界面元素的信號-槽,使之可以響應事件。QT提供了一種默認信號-槽對應關系:on_控件名稱_信號函數名稱(參數列表).當定義了這樣的函數后,QT會將函數自動與界面控件的信號相關聯,當控件觸發了相關事件后這個函數將會被觸發.另外一種方式是直接使用QObject::connect函數來關聯信號和槽.語法為:
connect(發出信號的對象指針,SIGNAL(信號函數原型), 響應信號的對象, SLOT(槽函數原型));
這里先說說信號及槽與普通成員函數有什么區別,只是定義的區域不同而已.信號函數需要聲明在頭文件的signals:關鍵字后面,無需實現.而槽則需要定義在public/private slots:關鍵字后面,實現與正常函數一樣,可以直接調用,當然調用權限與slots前面的范圍控制關鍵字(public/private)有關.這里強調幾點:
1)一個信號可以多次使用connect函數與多個槽關聯,信號觸發后這些槽不能保證調用順序,但都會執行一遍.
2)多個信號可以連接同一個槽.
3)信號之間可以互相關聯(語法為 connect(對象1,SIGNAL(信號函數原型), 對象2, SIGNAL(信號函數原型))),當第一個信號觸發另一個信號也會觸發
4)使用disconnect函數移除信號-槽的關聯
5)信號與槽的參數必須順序一致,類型相同,如果信號的參數比槽的參數多,多余的參數被忽略,反之報錯.
6)信號與槽的機制不僅僅限於界面開發,普通的類也可以聲明信號和槽,並建立關聯
觸發信號的語法為: emit 信號名稱(實參列表);
使用布局機制組織界面元素:布局控件有QHBoxLayout,QVBoxLayout及QGridLayout.分別是水平布局,垂直布局和網格布局控件.其他控件可放置與其上,當窗體大小改變的時候會自動調整界面元素位置和大小.QT還提供了一個伸展器控件,放置與布局控件的空閑部位使其他元素位置總是居上或居下.
在主窗體上創建菜單欄,工具欄:在頭文件中聲明QAction對象,每個QAction對應一個菜單欄、工具欄對象。在構造函數中實例化這些Action並將其顯示在菜單欄或工具欄上。
newAction = new QAction(tr("&New"), this);
newAction->setIcon(QIcon(":/images/new.png"));//設置資源中的圖片文件作為其圖標
newAction->setShortcut(QKeySequence::New);//設置快捷鍵 鍵值與系統有關
newAction->setStatusTip(tr("Create a new spreadsheet file"));//鼠標經過時顯示在狀態欄上的文字
connect(newAction, SIGNAL(triggered()), this, SLOT(newFile()));//設置信號-槽關聯
fileMenu = menuBar()->addMenu(tr("&File"));//創建頂層菜單 文件菜單
fileMenu->addAction(newAction);//將上面創建的Action添加到菜單上
fileToolBar = addToolBar(tr("&File"));//創建工具欄
fileToolBar->addAction(newAction);//將上面創建的Action添加到工具欄上
如果要創建部件的右鍵菜單,需要將Action添加到部件,並設置部件的上下文菜單的策略.更高級的實現方式是重寫部件的contextMenuEvent方法,創建一個QMenu窗口,在其中添加動作后調用exec()函數.
部件對象->addAction(newAction);
部件對象->setContextMenuPolicy(Qt::ActionsContextMenu);
設置狀態欄首先需要向狀態欄添加控件用來顯示信息.
locationLabel = new QLabel("W999");
locationLabel->setAlignment(Qt::AlignHCenter);
locationLabel->setMinimumSize(locationLabel->sizeHint());
locationLabel->setIndent(3);//設置擴展因子,在狀態欄大小發生變化是自動調整區域,默認擴展因子為0,表示大小不發生變化.
statusBar()->addWidget(locationLabel);//向狀態欄添加控件
QT啟動畫面(Splash)用於在程序啟動的時候顯示信息並等待啟動完畢后取消顯示.需要寫在main()函數中:
QSplashScreen *splash = new QSplashScreen();
splash->setPixmap(':/images/splash.png');
splash->show();
Qt::Alignmeng topRight = Qt::AlignRight | Qt::AlignTop;
splash->showMessage(QObject.tr("要顯示的信息"), topRight, Qt::white);
//后面可多次調用showMessage方法向用戶顯示不同信息.使用完畢關閉之.
splash->finish(&mainWin);//將控制權交給mainWin窗體
delete splash;
QMainWindow的中央窗口部件屬性用於指定主窗體中央區域顯示的部件,這些部件可以是普通的多行控件,自定義的窗體部件,帶布局管理的部件,或切分窗口的QSplitter部件,或用於實現MDI風格的QMdiArea部件.這里說說MDI風格的窗體實現.首先從QMainWindow類繼承一個子類,在子類的構造函數中:
mdiArea = new QMdiArea();
setCentralWidget(mdiArea);
mdiArea->addSubWindow(部件類型指針);//將部件(QWidget類型)添加到區域中作為一個子窗口
mdiArea->activeNextSubWindow();//使下一個子窗體為當前活動窗體
mdiArea->activeSubWindow()返回當前子窗體
mdiArea->setActiveSubWindow(子窗體對象指針)//設置當前子窗體.子窗體對象必須包含在mdiArea中,否則報錯.
通過上面的函數基本上可以實現MDI窗體了,但是子窗體的打開關閉,或當前子窗體發生變化,都會影響主菜單及工具欄中各項的狀態,這里需要靈活應用信號-槽機制,在發生狀態變化的時候調整Enabled屬性.
自定義QT控件:在繼承QWidget實現了特定功能可視化部件后,可以使用插件的方式將其加入QT設計師工具中,這樣就可以在設計器用鼠標拖放的方式將自定義的部件添加的窗體中了.首先需要從QDesignerCustomWidgetFnterface繼承一個子類,重寫幾個函數指定控件的名稱,所在的組,提示信息等,關鍵的函數是createWidget方法,返回特定窗口部件的實例.最后在插件源文件的末尾添加Q_EXPORT_PLUGIN2宏將插件注冊到設計師.
QT4極大的改善了繪圖的刷新效率,但在及特殊情況下也需要使用雙緩沖區機制,思路是創建一個QPixmap,需要繪制的圖形現在其上繪制完畢后,在觸發paintEvent事件時直接將這個pixMap刷到屏幕的圖像區域之上.
QT的事件機制:要處理對象的事件,可以重寫QObject::event()函數,這個函數會將特定事件進行分發,如鼠標事件mousePressEvent,鍵盤事件keyPressEvent,及paintEvent等,如果關心特定事件也可以重寫這些事件.如果需要定時觸發的timer機制,可以重寫timerEvent函數.首先int myTimeId = startTimer(時間間隔ms);在timerEvent中:if(event->timerId() == myTimeId) {...........}
QT提供了事件監控機制,在構造函數中調用 對象1->installEventFilter(對象2);這樣就可以使用對象2來監控對象1的事件,對象2重寫其eventFilter函數,通過target參數來確定事件的發出者,並可以對事件進行干預.QT的事件是從子對象向父對象傳遞的,如果子對象處理了事件則停止傳遞.需要注意的是installEventFilter函數是定義在QObject上的,所以可以在QApplication上設置事件監控,控制整個應用程序的事件.重寫QApplication::notify()函數可在事件剛發出就截獲事件.如果在密集運行時希望界面響應事件,需要調用QApplication::processEvents();方法.
給Qt工程生成的可執行文件添加圖標
1. 找一個ico文件,該名為適當的。如EXEICON.ico。
2. 手動創建一個對應的rc文件。如EXEICON.rc:
IDI_ICON1 ICON DISCARDABLE "EXEICON.ico"
3. 將上面兩個文件放在當前目錄,把HdssMap.rc加入工程在中。重新生成即可。
給Qt窗體添加圖標
在main函數中:
QApplication a(argc, argv);
a.setWindowIcon(QIcon(":/DataManager/Resources/statics.png"));
給Qt程序設置默認皮膚:
QApplication a(argc, argv);
a.setStyle("windowsxp");
還可設置為:"windows","motif","cde","motifplus","platinum","sgi"和"compact".根據平台,"windowsxp","aqua"或"macintosh"也是可以用的。
Qt中計算一段程序的運行時間:
#include <QTime>
QTime tmpTime;
tmpTime.start();
qDebug() << tmpTime.elapsed() << "ms";
