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