1. 程式人生 > >Qt中的對話方塊

Qt中的對話方塊

  對話方塊是GUI程式和使用者進行簡短互動的頂層視窗,所謂頂層視窗即始終在主視窗之上顯示。QDialog是Qt所有型別的對話方塊視窗的基類,它繼承於QWidget,是一種容器型別元件。

這裡寫圖片描述

  QWidget是所有視窗類的抽象,它也可以生成對話方塊,但是對話方塊是常見的視窗元件,若每次要使用對話方塊,都利用QWidget來生成並設定相關引數,顯然十分繁瑣。所以Qt為我們封裝了另外一個子類QDialog,專門用於生成對話方塊。

1. 模態和非模態對話方塊

  對話方塊歸為兩大類,即模態對話方塊於非模態對話方塊。
  模態對話方塊(QDialog::exec())
  阻塞型的對話方塊,顯示後無法與父視窗進行互動。如word文件中修改原始檔內容後直接關閉視窗彈出的對話方塊:
這裡寫圖片描述


  非模態對話方塊(QDialog::show())
  非阻塞型的對話方塊,顯示後還可以與父視窗進行互動。如word文件的替換操作:
這裡寫圖片描述

  模態對話方塊:
  (1) 定義一個主視窗,視窗內有一個按鈕:

//Widget.h
#ifndef WIDGET_H
#define WIDGET_H

#include <QtGui/QApplication>
#include <QWidget>
#include <QPushButton>
#include <QDebug>

class Widget : public QWidget
{
    Q_OBJECT            //表要類要使用訊號與槽機制
protected: QPushButton Btn; //按鈕 protected slots: void Btn_Clicked(); //槽,用於響應按鈕按下操作 public: Widget(QWidget *parent = 0); //parent預設引數為0,表預設是容器類父視窗 ~Widget(); }; #endif // WIDGET_H //Widget.cpp #include "Widget.h" #include "Dialog.h" //Widget的建構函式,Btn初始化為其Widget的功能類字子元件 Widget::Widget(QWidget *parent) : QWidget(parent), Btn(this
) { Btn.resize(80, 30); Btn.move(40, 40); Btn.setText("btn"); resize(240, 100); setWindowTitle("hello"); connect(&Btn, SIGNAL(clicked()), this, SLOT(Btn_Clicked())); } Widget::~Widget() { } //Widget內按鈕的響應槽,該按鈕按下後Winget會彈出對話方塊(Dialog) void Widget::Btn_Clicked() { qDebug() << "Btn_Clicked()"; Dialog d(this); //Dialog是對話方塊類,見下 int ret = d.exec(); //exec()表明d是個模態對話方塊,使用者不操作該對話方塊,會阻塞於此。 //exec()返回對話方塊的執行結果 if (ret == Dialog::Accepted) { qDebug() << "Accepted"; } else if (ret == Dialog::Rejected) { qDebug() << "Rejected"; } }

  (2) 定義一個對話方塊,框內有兩個按鈕

//Dialog.h
#ifndef DIALOG_H
#define DIALOG_H

#include <QWidget>
#include <QDebug>
#include <QPushButton>
#include <QtGui/QDialog>

class Dialog : public QDialog
{
    Q_OBJECT
protected:
    QPushButton Btn1;   //對話方塊內按鈕1
    QPushButton Btn2;   //對話方塊內按鈕2
protected slots:
    void Btn1_Clicked();    //按鈕1的槽
    void Btn2_Clicked();    //按鈕2的槽
public:
    Dialog(QWidget *parent = 0);
    ~Dialog();
};

#endif // DIALOG_H

#include "Dialog.h"

//Dialog類的建構函式,初始化列表指定兩個按鈕的父視窗都為Dialog
Dialog::Dialog(QWidget *parent) : QDialog(parent), Btn1(this), Btn2(this)
{
    //初始化按鈕1
    Btn1.setText("Btn1");
    Btn1.move(20, 20);
    Btn1.resize(100, 30);

    //初始化按鈕2
    Btn2.setText("Btn2");
    Btn2.move(140, 20);
    Btn2.resize(100, 30);

    //初始化對話方塊的大小以及設定其名字
    this->resize(260, 70);
    this->setWindowTitle("Dialog");

    //訊號與槽的對映
    connect(&Btn1, SIGNAL(clicked()), this, SLOT(Btn1_Clicked()));
    connect(&Btn2, SIGNAL(clicked()), this, SLOT(Btn2_Clicked()));
}

Dialog::~Dialog()
{    
}

//按鈕1的槽
void Dialog::Btn1_Clicked()
{
    qDebug() << "Btn1_Clicked()";
    done(Accepted);
}

//按鈕2的槽
void Dialog::Btn2_Clicked()
{
    qDebug() << "Btn2_Clicked()";
    done(Rejected);
}

  (3) main函式

//main.cpp
#include "Dialog.h"
#include "Widget.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;

    w.show();

    return a.exec();
}

  只有模態對話方塊才有返回值的概念,返回值用於表示對話方塊和使用者的互動結果。函式:

void QDialog::done(int);

  用於關閉對話方塊並將引數i作為與使用者的互動結果,發回給exec()的呼叫處。i的取值可為Accepted、Rejected或其其他int型資料,Accepted、Rejected是在QDialog類中定義的列舉型別,前者表示使用者操作成功,後者表示操作失敗。

  非模態對話方塊:
  在棧中建立模態對話方塊是常用的方式,而非模態對話方塊由於其顯示函式是非阻塞的,所以需要在堆中建立。Widget::Btn_Clicked()函式改寫為:

void Widget::Btn_Clicked()
{
    qDebug() << "Btn_Clicked()";

    Dialog* d = new Dialog();
    d->setAttribute(Qt::WA_DeleteOnClose);
    d->show();

    qDebug() << "Btn_Clicked() exit!";
}

  show()函式是非阻塞的,對話方塊Dialog物件d若是在棧中生成那函式退出後對話方塊也隨之消失,所以非模態對話方塊需在堆中動態生成,這樣該函式退出後對話方塊仍能顯示,但是卻也出現了新的問題:指標d執行動態生成的空間,一旦該函式退出後,d指標將失效,這也就意味著其他函式無法釋放該堆空間,造成記憶體洩漏。因此Qt提供了“對話方塊被使用者關閉後就釋放給對話方塊佔據的堆空間”的操作:

d->setAttribute(Qt::WA_DeleteOnClose);

  Qt對話方塊的模態/非模態是通過對話方塊的屬性變數modal確定的,modal是個bool型別的變數,預設情況下是false,即非模態,所以呼叫show()函式顯示對話方塊時是非模態的;呼叫exec()函式顯示時,它將忽略modal的屬性值的設定並將對話方塊設定為模態對話方塊。

  除了模態、非模態,還有一種混合特性的對話方塊,即通過QDialog::setModal()函式設定modal變數為true,那麼該對話方塊將變成:對話方塊在堆中分配,同時用show()顯示的前提下,同時又是模態對話方塊。

QDialog* dialog = new QDialog(this);
dialog->setAttribute(Qt::WA_DeleteOnClose);
dialog->setModal(true);
dialog->show();

2. Qt中定義的常用對話方塊

  Qt提供了一些可複用的常用對話方塊類,這些類都繼承自QDialog類,有描述提示型訊息的QMessageBox、描述檔案相關的QFileDialog、描述印表機選擇的QPrintDialog,描述顏色選擇的QColorDialog等等。

  對於這些對話方塊類的使用,都遵循如下規則:

//1. 定義對話方塊
Dialogxxx d(this);

//2. 設定對話方塊屬性,如對話方塊標題、文字顯示
d.setxxx(xxx);

//3. 判斷對話方塊被使用者操作後的返回值,
if (d.exec() == Dialogxxx::xxx)
{
    //執行相關操作
}

  下面是上述Qt實現好的對話方塊類的使用,它們定義在Widget型別的父類視窗類中的按鈕槽函式中。

2.1 訊息對話方塊

  訊息對話方塊主要用於為使用者提示訊息,強制使用者進行選擇:

//提示使用者訊息
#include <QMessageBox>

//強制使用者選擇
QMessageBox msg(this);              //建立對話方塊
msg.setWindowTitle("xxxx");         //設定對話方塊標題
msg.setText("customMsgBtnClicked"); //設定對話方塊的提示資訊
msg.setIcon(QMessageBox::Warning);  //設定對話方塊的圖示
//設定對話方塊的按鈕
msg.setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel | QMessageBox::YesToAll);  

QMessageBox msg(this);
msg.setText("this is a message dialog!");
msg.exec();

  執行結果:
這裡寫圖片描述

2.2 檔案對話方塊

  在GUI程式中,開啟檔案和儲存檔案的時候都會彈出對話方塊,

//GUI程式要開啟系統上的檔案
#include <QFileDialog>

QFileDialog d(this);                        //建立對話方塊
d.setAcceptMode(QFileDialog::AcceptOpen);   //設定該對話方塊的模式為開啟
d.setFileMode(QFileDialog::ExistingFiles);  //選擇開啟的是檔案,ExistingFiles表可選擇多檔案,
                                            //ExistingFile則表示只能選擇一個檔案,目錄則是QFileDialog::Directory
d.setFilter("TEXT(*.txt)");                 //以檔案格式過濾掉檔案

if (d.exec() == QFileDialog::Accepted)      //執行成功
{
    QStringList fs = d.selectedFiles();     //列印使用者選擇的結果

    for (int i = 0; i < fs.count(); i++)
    {
        qDebug() << fs[i];
    }
}

  執行結果:
這裡寫圖片描述

//GUI程式要儲存檔案
QFileDialog d(this);
d.setAcceptMode(QFileDialog::AcceptSave);
//d.setFilter("c(*.c)");

if (d.exec() == QFileDialog::Accepted)
{
    QStringList fs = d.selectedFiles();

    for (int i = 0; i < fs.count(); i++)
    {
        qDebug() << fs[i];
    }
}

  執行:
這裡寫圖片描述

2.3 顏色對話方塊

#include <QColorDialog>
QColorDialog d(this);
d.setWindowTitle("color editor");

if (d.exec() == QColorDialog::Accepted)
{
    QColor color = d.selectedColor();
    qDebug() << color;
    qDebug() << color.red();
    qDebug() << color.green();
    qDebug() << color.blue();
}

  執行:
這裡寫圖片描述

  setCurrentColor()函式用於設定當前的顏色值:

d.setCurrentColor(QColor(100, 100, 100));

  QColor類用於表現顏色值,該類有一個建構函式:

QColor ( int r, int g, int b, int a = 255 )

2.4 輸入對話方塊

  輸入對話方塊QInputDialog類,用於需要臨時進行資料輸入的場合:

QInputDialog d(this);
d.setWindowTitle("input dat");
d.setLabelText("ple input dat");
d.setInputMode(QInputDialog::IntInput);  //TextInput輸入文字,DoubleInput輸入double型別
if (d.exec() == QInputDialog::Accepted)
    qDebug() << d.intValue();           //TextValue、doubleValue

  執行:
這裡寫圖片描述

2.5 字型對話方塊

  QFontDialog類用於選擇字型的對話方塊:

#include <QFontDialog>
QFontDialog f(this);
f.setWindowTitle("font select");
f.setCurrentFont(QFont(QFont("gargi", 10, QFont::Bold)));   //設定彈出的對話方塊的選擇的字型

if (f.exec() == QFontDialog::Accepted)
{
    qDebug() << f.selectedFont();
}

執行:
這裡寫圖片描述

2.6 進度對話方塊

  QProgressDialog類用於顯示進度資訊,不需要判斷exec()函式的返回值:

#include <QProgressDialog>
QProgressDialog d(this);
d.setWindowTitle("load");

//設定範圍值
d.setMinimum(0);
d.setMaximum(100);

//設定進度數值
d.setValue(96);

//設定提示資訊
d.setLabelText("xxxxxxxx");

d.exec();

執行:
這裡寫圖片描述

2.7 列印對話方塊

  QPrinter類封裝了列印裝置驅動及其引數,利用該類尅以相同的方式使用系統的不同的列印裝置列印。

#include <QPrintDialog>
#include <QTextDocument>
#include <QPrinter>

QPrintDialog d(this);
d.setWindowTitle("print test");

if (d.exec() == QPrintDialog::Accepted)
{
    QPrinter *p = d.printer();
    QTextDocument td;

    //可以通過印表機列印,這裡是列印到文字檔案
    td.setPlainText("print test!!");    //待列印的文字
    p->setOutputFileName("./tt.txt");   //列印到此檔案
    td.print(p);
}

執行:
這裡寫圖片描述

相關推薦

Qt 標準對話方塊messagbox各種型別使用方法記錄

QMessageBox::information: QMessageBox::information(NULL, "Title", "Content", QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes); 下面是一個簡單的

Android對話方塊右上角關閉懸浮按鈕的實現(總結)

其實很簡單,步驟如下: 1、需要把對話方塊的預設背景改為透明。 方法:自定義Dialog的樣式。 <!--對話方塊透明背景--> <style name="Translucent_NoTitle" parent="android:style/Theme

MFC對話方塊資源的複製

在工程中匯入已建好的對話方塊,方法有三: 法一: 1、首先要生成一個*.ogx的檔案。    方法:開啟包含有所要加的對話方塊資源的工程(別的工程)。          在檢視資源(ClassView)中滑鼠右鍵點選所需的對話方塊的類(也可以是所需的類)      

WPF程式設計,C#對話方塊自動關閉的一種方法。

MessageBoxTimeout是一個微軟未公開的Windows API函式。實現定時訊息,功能類似於MessageBox。如果使用者不迴應,能定時關閉訊息框。函式由user32.dll匯出,windows2000及以下沒有此函式。    原型: int Mes

vc對話方塊使用技巧集合

注:以下程式碼以一個名為CTest6Dlg的對話方塊類為例 -------------------------------------------------------------------------------- 1. 在工作列隱藏對話方塊        Mo

【VC MFC開發】Dll 對話方塊的控制元件無法接受到按鍵訊息的解決辦法

使用DLL注入到 別的程式中時,發現DLL的視窗過程無法響應WM_CHAR事件,摸索了很久,才找到原因,給碰到同樣問題的人蔘考。 WNDPROC OldComboEditProc = NULL; LRESULT CALLBACK ComboEditProc(   HW

QT QDialog 對話方塊顯示幾秒鐘自動關閉

在實際開發中,我們會有這樣一種需求,一個提示框,使用者可以手動關閉,或者在使用者沒有操作的情況下,顯示3秒鐘然後自動關閉,這樣應該怎樣做呢?我們的思路應該是這樣的:1.對話方塊建構函式裡,設定一個定時器

十一、Qt對話方塊建立與銷燬

模態對話方塊就是指在子對話方塊彈出時,焦點被強行集中於該子對話方塊,子對話方塊不關閉,使用者將無法操作其他的視窗。非模態相反,使用者仍然可以操作其他的視窗,包括該子對話方塊的父對話方塊。 如果從執行緒角度來講,模態對話方塊實際上是執行緒阻塞的,也就是子對話方塊是一個執行

QT-懸浮對話方塊

開發環境:VS2010+QT4.8.6 實現功能:當滑鼠懸浮於按鈕控制元件,彈出對話方塊。離開時,對話方塊關閉。並且對話方塊的位置隨滑鼠一起改變。 新建qt application(csdn_hoverdialog) 為懸浮對話方塊新建一個QDialog類(hoverdia

Java對話方塊的彈出

最近在做學校的課程設計,java程式設計需要用到對話方塊彈出,第一反應是js中的alert和confirm,java的話瞬間懵,查閱學習總結如下,用以以後的學習 1.顯示一個錯誤對話方塊,該對話方塊顯示的 message 為 '年齡請輸入數字',標題為“標題【出錯啦】”

Qt學習之路12--Qt標準對話方塊(字型對話方塊、進度條對話方塊和列印對話方塊

使用預定義對話方塊的三板斧原則:定義物件後設置父元件和屬性、模態呼叫exec()、根據結果判斷執行流程。 字型對話方塊 字型對話方塊屬於Qt預定義的對話方塊型別,它的作用就是通過使用者得到字型型別並返回。 QFontDialog dia(this)

轉:MFC對話方塊圖示的修改

mfc中刪除資源標籤中的圖示直接delete就可以了 很多時候我們對於MFC框架應用程式的預設圖示十分不滿意,所以我們來將把他換掉。   預設的VC6.0下的MFC圖示和VC2005中的MFC圖示分別如下:   很多朋友會問我怎麼把圖示換掉,我看很多人寫很多程式碼,出很多錯,

Qt: 進度對話方塊的使用

           在執行長時間任務時,如果沒有進度條,使用者很難把握任務完成進度,而且如果耗時太長或誤操作 沒有進度條就無法取消任務。對於GUI程式,還會導致主介面假死現象。所以對於一個長時間任務

QT】如何將QFileDialog對話方塊的英文內容轉化為中文

如何將QFileDialog對話方塊中的英文內容轉化為中文 在QT安裝目錄中找到相應的.qm檔案,如/usr/local/Trolltech/Qt-4.8.7/translations/qt_zh_CN.qm 在程式的入口函數出增加如下程式碼 #include &

Qt對話方塊show和exec的區別

QDialog的顯示有兩個函式show()和exec()。他們的區別在參考文件上的解釋如下: show(): 顯示一個非模式對話方塊。控制權即刻返回給呼叫函式。 彈出視窗是否模式對話方塊,取決於modal屬性的值。 (原文:Shows the dia

Qt對話方塊

  對話方塊是GUI程式和使用者進行簡短互動的頂層視窗,所謂頂層視窗即始終在主視窗之上顯示。QDialog是Qt所有型別的對話方塊視窗的基類,它繼承於QWidget,是一種容器型別元件。   QWidget是所有視窗類的抽象,它也可以生成對話方塊,但是對話

Qt開啟檔案對話方塊和儲存檔案對話方塊

主要是用QFileDialog的兩個靜態方法 1、開啟對話方塊 QString getOpenFileName(QWidget * parent = 0, const QString & caption = QString(), const QStr

qt獲取開啟檔案路徑,顏色對話方塊,字型對話方塊,自定義對話方塊,訊息對話方塊,輸入對話方塊

1.獲取開啟檔案的檔案路徑 //獲取開啟檔案的檔案路徑--父視窗,視窗名稱,開啟路徑,檔案篩選 QString s = QFileDialog::getOpenFileName(this,"open file dialog","/","C++ files(*.c

Qt給透明對話方塊新增border-image樣式

QDialog是可設定border-image樣式的,但假如對話方塊設定了Qt::WA_TranslucentBackground屬性,再show出來則發現,背景空空如也,完全被穿透,只有子控制元件懸在上面。這是因為,開啟Qt::WA_TranslucentBackgrou

《MFC&Qt混合程式設計》 part1 MFC對話方塊嵌入Qt視窗控制元件

《MFC&Qt混合程式設計》 part1 MFC對話方塊中嵌入Qt視窗控制元件 1、環境配置:VS2010,Qt4.8.4_win64,Qt_VS_Addin_1.1.11 2、建立的MFC對話方塊程式 3、輸出為x64的debug&r