Qt 編寫多窗口程序

該文章原創於 Qter開源社區 www.qter.org ),做者 yafeilinux ,轉載請註明出處! 


導語

       程序要實現的功能是:程序開始出現一個對話框,按下按鈕後便能進入主窗口,若是直接關閉這個對話框,便不能進入主窗口,整個程序也將退出。當進入主窗口後,咱們按下按鈕,會彈出一個對話框,不管如何關閉這個對話框,都會回到主窗口。
程序裏咱們先創建一個工程,設計主界面,而後再創建一個對話框類,將其加入工程中,而後在程序中調用本身新建的對話框類來實現多窗口。
在這一篇還會涉及到代碼裏中文字符串顯示的問題。

 

環境是: 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文件中先定義一個對話框對象,並再在構造函數中進行建立,而後再到這裏使用。
     下面你們能夠運行一下程序,查看效果。

結語

     這個程序裏咱們實現了兩類窗口打開的方式,一個是自身消失然後打開另外一個窗口,一個是打開另外一個窗口而自身不消失。能夠看到他們實現的方法是不一樣的
相關文章
相關標籤/搜索