導語
程序要實現的功能是:程序開始出現一個對話框,按下按鈕後便能進入主窗口,若是直接關閉這個對話框,便不能進入主窗口,整個程序也將退出。當進入主窗口後,咱們按下按鈕,會彈出一個對話框,不管如何關閉這個對話框,都會回到主窗口。
程序裏咱們先創建一個工程,設計主界面,而後再創建一個對話框類,將其加入工程中,而後在程序中調用本身新建的對話框類來實現多窗口。
在這一篇還會涉及到代碼裏中文字符串顯示的問題。
環境是:
Windows 7 + Qt 4.8.1 +Qt Creator 2.4.1
目錄
1、添加主窗口
2、代碼中的中文顯示
3、添加登陸對話框
4、使用自定義的對話框類
正文
1、添加主窗口
1.
咱們打開Qt Creator
,新建Qt Gui
應用,項目名稱設置爲「nWindows
」,在類信息界面保持基類爲QMainWindow
,類名爲MainWindow
,這樣將會生成一個主窗口界面。
2.
完成項目建立後,打開mainwindow.ui
文件進入設計模式,向界面上拖入一個Push Button
,而後對其雙擊並修改顯示文本爲「按鈕」,以下圖所示。
3.
如今運行程序,發現中文能夠正常顯示。在設計模式能夠對界面進行更改,那麼使用代碼也能夠完成相同的功能,下面就添加代碼來更改按鈕的顯示文本。
2、代碼中的中文顯示
1.
咱們點擊Qt Creator
左側的「編輯」按鈕進入編輯模式,而後雙擊mainwindow.cpp
文件對其進行編輯。在構造函數MainWindow()
中添加代碼:
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
ui->pushButton->setText("新窗口"); //將界面上按鈕的顯示文本更改成「新窗口」
}
linux
這裏的ui
對象就是界面文件對應的類的對象,在mainwindow.h
文件中對其進行了定義,咱們能夠經過它來訪問設計模式添加到界面上的部件。前面添加的按鈕部件Push Button
,在其屬性面板上能夠看到它的objectName
屬性的默認值爲pushButton
,這裏就是經過這個屬性來獲取部件對象的。
咱們使用了QPushButton
類的setText()
函數來設置按鈕的顯示文本,如今運行程序,效果以下圖所示。
2.
咱們發現,在代碼中來設置按鈕的中文文本出現了亂碼。這個能夠有兩種方法來解決,一個就是在編寫程序時使用英文,當程序完成後使用Qt
語言家來翻譯整個軟件中的顯示字符串;還有一種方法就是在代碼中設置字符串編碼,而後使用函數對要在界面上顯示的中文字符串進行編碼轉換。由於翻譯一個軟件很麻煩,對於這些小程序,咱們但願中文能夠當即顯示出來,因此下面來說解第二種方法。
3.
設置字符串編碼,可使用QTextCodec
類的setCodecForTr()
函數,通常的使用方法就是在要進行編碼轉換以前調用該函數,下面咱們在main.cpp
文件中添加代碼:
#include
<QtGui/QApplication>
#include
"mainwindow.h"
#include
<QTextCodec>
//
添加頭文件
int
main(int argc, char *argv[])
{
QApplication
a(argc,
argv);
QTextCodec
::
setCodecForTr(QTextCodec::codecForLocale());
//
設置編碼
MainWindow
w;
w.
show();
return
a.
exec();
}
由於咱們要在MainWindow
類中進行編碼轉換,因此要在建立w
對象之前調用該函數。這裏的codecForLocale()
函數返回適合本地環境的編碼,固然,也能夠指定編碼,例如要設置爲「GB2312」,可使用下面的代碼:
QTextCodec
::setCodecForTr(QTextCodec::codecForName("GB2312"));
當設置完編碼後,就要在顯示中文字符串的地方使用tr()
函數,這裏咱們須要將修改按鈕顯示文本的代碼更改成:
ui
->
pushButton
->setText(tr("
新窗口
"
));
如今運行程序,能夠發現中文已經能夠正常顯示了。這裏提示一下,若是感受編輯器中的字體過小,可使用Ctrl + +(同時按下Ctrl和加號鍵)來進行放大,使用Ctrl+ -能夠縮小。
3、添加登陸對話框
1.
往項目中添加新文件,這裏能夠在編輯模式的項目目錄上點擊鼠標右鍵,而後選擇添加新文件菜單,以下圖所示。固然也能夠在文件菜單中進行添加。
2.
模板選擇Qt
設計師界面類,而後界面模板選擇Dialog without Butt**
,以下圖所示。
3.
點擊下一步進入類信息界面,這裏將類名更改成LoginDlg
(注意類名首字母通常大寫)。以下圖所示。
4.
當完成後會自動跳轉到設計模式,對新添加的對話框進行設計。咱們向界面上拖入一個Push Button
,而後更改顯示文本爲「登陸到主界面」。爲了實現點擊這個按鈕後能夠關閉該對話框並顯示主窗口,咱們須要設置信號和槽的關聯。點擊設計模式上方的
圖標,或者按下F4
,便進入了信號和槽編輯模式。按着鼠標左鍵,從按鈕上拖向界面,以下圖所示。
當放開鼠標後,會彈出配置鏈接對話框,這裏咱們選擇pushButton
的clicked()
信號和LoginDlg
的accept()
槽並按下肯定按鈕。以下圖所示。
設置好信號和槽的關聯後,界面以下圖所示。
這裏簡單介紹一下信號和槽,你們能夠把它們都看作是函數,好比這裏,當單擊了按鈕之後就會發射單擊信號,即clicked();而後對話框接收到信號就會執行相應的操做,即執行accept()槽。通常狀況下,咱們只須要修改槽函數便可,不過,這裏的accept()已經實現了默認的功能,它會將對話框關閉並返回Accepted,因此咱們無需再作更改。下面咱們就是要使用返回的Accepted來判斷是否按下了登陸按鈕。
完成後,能夠按下
或者按下F3
來返回控件編輯模式。
4、使用自定義的對話框類
1.
按下Ctrl+2
返回代碼編輯模式,在這裏打開main.cpp
文件,添加代碼:
#include
<QtGui/QApplication>
#include
"mainwindow.h"
#include
<QTextCodec>
//
添加頭文件
#include
"logindlg.h"
//
添加頭文件
int
main(int argc, char *argv[])
{
QApplication
a(argc,
argv);
//
QTextCodec::setCodecForTr(QTextCodec::codecForLocale());
//
設置編碼
QTextCodec
::
setCodecForTr(QTextCodec::codecForName("GB2312"));
MainWindow
w;
LoginDlg
dlg;
//
創建本身新建的類的對象dlg
if
(dlg.
exec() == QDialog::Accepted) //
利用Accepted返回值判斷按鈕是否被按下
{
w.
show(); //
若是被按下,顯示主窗口
return
a.
exec(); //
程序一直執行,直到主窗口關閉
}
else
return
0
;
//
若是沒被按下,則不會進入主窗口,整個程序結束運行
}
在這裏,咱們先建立了LoginDlg
類的對象dlg
,而後讓dlg
運行,即執行exec()
函數,並判斷對話框的返回值,若是是按下了登陸按鈕,那麼返回值應該是Accepted
,這時就顯示主窗口,並正常執行程序;若是沒有按下登陸按鈕,那麼就結束程序。
如今你們能夠運行程序,測試一下效果。
2.
上面講述了一種顯示對話框的狀況,下面再來說述一種狀況。咱們打開mainwindow.ui
文件進入設計模式,而後在按鈕部件上單擊鼠標右鍵並選擇轉到槽菜單,以下圖所示。
在彈出的轉到槽對話框中選擇clicked()
信號並按下肯定按鈕。這時會跳轉到編輯模式mainwindow.cpp
文件的on_pushButton_clicked()
函數處,這個就是自動生成的槽,它已經在
mainwindow.h
文件中進行了聲明。咱們只須要更改函數體便可。這裏更改成:
void
MainWindow
::
on_pushButton_clicked()
{
QDialog
*dlg
=
new
QDialog
(
this
);
dlg->
show();
}
咱們建立了一個對話框對象,而後讓其顯示,這裏的this參數代表這個對話框的父窗口是MainWindow。注意這裏還須要添加#include <QDialog>頭文件包含。有的童鞋可能會問,這裏若是屢次按下按鈕,那麼每次都會生成一個對話框,是否會形成內存泄露或者內存耗盡。這裏簡單說明一下,由於如今只是演示程序, Qt的對象樹機制保證了不會形成內存泄露,並且不用寫delete語句;並且由於是桌面程序,對於這樣一個簡單的對話框,其使用的內存能夠被忽略。
固然,嚴謹的童鞋也能夠在mainwindow.h文件中先定義一個對話框對象,並再在構造函數中進行建立,而後再到這裏使用。
下面你們能夠運行一下程序,查看效果。
結語
這個程序裏咱們實現了兩類窗口打開的方式,一個是自身消失然後打開另外一個窗口,一個是打開另外一個窗口而自身不消失。能夠看到他們實現的方法是不一樣的