天天看點

「Qt入門第二篇」基礎(二)編寫Qt多視窗程式

作者:QT教程

導語

程式要實作的功能是:程式開始出現一個對話框,按下按鈕後便能進入主視窗,如果直接關閉這個對話框,便不能進入主視窗,整個程式也将退出。當進入主視窗後,我們按下按鈕,會彈出一個對話框,無論如何關閉這個對話框,都會回到主視窗。

程式裡我們先建立一個工程,設計主界面,然後再建立一個對話框類,将其加入工程中,然後在程式中調用自己建立的對話框類來實作多視窗。

在這一篇還會涉及到代碼裡中文字元串顯示的問題。

環境是:Windows 7 + Qt 4.8.1 +Qt Creator 2.4.1

目錄

  • 一、添加主視窗
  • 二、代碼中的中文顯示
  • 三、添加登入對話框
  • 四、使用自定義的對話框類

正文

一、添加主視窗

1.我們打開Qt Creator,建立Qt Gui應用,項目名稱設定為nWindows,在類資訊界面保持基類為QMainWindow,類名為MainWindow,這樣将會生成一個主視窗界面。

2.完成項目建立後,打開mainwindow.ui檔案進入設計模式,向界面上拖入一個Push Button,然後對其輕按兩下并修改顯示文本為“按鈕”,如下圖所示。

「Qt入門第二篇」基礎(二)編寫Qt多視窗程式

3.現在運作程式,發現中文可以正常顯示。在設計模式可以對界面進行更改,那麼使用代碼也可以完成相同的功能,下面就添加代碼來更改按鈕的顯示文本。

二、代碼中的中文顯示

1.我們點選Qt Creator左側的“編輯”按鈕進入編輯模式,然後輕按兩下mainwindow.cpp檔案對其進行編輯。在構造函數MainWindow()中添加代碼:

MainWindow::MainWindow(QWidget *parent) :    
        QMainWindow(parent),    
        ui(new Ui::MainWindow)
{    
        ui->setupUi(this);    
        ui->pushButton->setText("新視窗"); //将界面上按鈕的顯示文本更改為“新視窗”
}           

這裡的ui對象就是界面檔案對應的類的對象,在mainwindow.h檔案中對其進行了定義,我們可以通過它來通路設計模式添加到界面上的部件。前面添加的按鈕部件Push Button,在其屬性面闆上可以看到它的objectName屬性的預設值為pushButton,這裡就是通過這個屬性來擷取部件對象的。

我們使用了QPushButton類的setText()函數來設定按鈕的顯示文本,現在運作程式,效果如下圖所示。

「Qt入門第二篇」基礎(二)編寫Qt多視窗程式

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+ -可以縮小。

三、添加登入對話框

1.往項目中添加新檔案,這裡可以在編輯模式的項目目錄上點選滑鼠右鍵,然後選擇添加新檔案菜單,如下圖所示。當然也可以在檔案菜單中進行添加。

「Qt入門第二篇」基礎(二)編寫Qt多視窗程式

2.模闆選擇Qt設計師界面類,然後界面模闆選擇Dialog without Button,如下圖所示。

「Qt入門第二篇」基礎(二)編寫Qt多視窗程式

3.點選下一步進入類資訊界面,這裡将類名更改為LoginDlg(注意類名首字母一般大寫)。如下圖所示。

「Qt入門第二篇」基礎(二)編寫Qt多視窗程式

4.當完成後會自動跳轉到設計模式,對新添加的對話框進行設計。我們向界面上拖入一個Push Button,然後更改顯示文本為“登入到主界面”。為了實作點選這個按鈕後可以關閉該對話框并顯示主視窗,我們需要設定信号和槽的關聯。點選設計模式上方的

「Qt入門第二篇」基礎(二)編寫Qt多視窗程式

圖示,或者按下F4,便進入了信号和槽編輯模式。按着滑鼠左鍵,從按鈕上拖向界面,如下圖所示。

「Qt入門第二篇」基礎(二)編寫Qt多視窗程式

當放開滑鼠後,會彈出配置連接配接對話框,這裡我們選擇pushButton的clicked()信号和LoginDlg的accept()槽并按下确定按鈕。如下圖所示。

「Qt入門第二篇」基礎(二)編寫Qt多視窗程式

設定好信号和槽的關聯後,界面如下圖所示。

「Qt入門第二篇」基礎(二)編寫Qt多視窗程式

這裡簡單介紹一下信号和槽,大家可以把它們都看做是函數,比如這裡,當單擊了按鈕以後就會發射單擊信号,即clicked();然後對話框接收到信号就會執行相應的操作,即執行accept()槽。一般情況下,我們隻需要修改槽函數即可,不過,這裡的accept()已經實作了預設的功能,它會将對話框關閉并傳回Accepted,是以我們無需再做更改。下面我們就是要使用傳回的Accepted來判斷是否按下了登入按鈕。

完成後,可以按下

「Qt入門第二篇」基礎(二)編寫Qt多視窗程式

或者按下F3來傳回控件編輯模式。

四、使用自定義的對話框類

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檔案進入設計模式,然後在按鈕部件上單擊滑鼠右鍵并選擇轉到槽菜單,如下圖所示。

「Qt入門第二篇」基礎(二)編寫Qt多視窗程式

在彈出的轉到槽對話框中選擇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檔案中先定義一個對話框對象,并再在構造函數中進行建立,然後再到這裡使用。

下面大家可以運作一下程式,檢視效果。

結語

這個程式裡我們實作了兩類視窗打開的方式,一個是自身消失而後打開另一個視窗,一個是打開另一個視窗而自身不消失。可以看到他們實作的方法是不同的。