QMessageBox类:
含有Question消息框、Information消息框、Warning消息框和Critical消息框等
通常有两种方式可以来创建标准消息对话框:
一种是采用“基于属性”的API,一种是使用QMessageBox的静态方法。
后者书写容易,但缺少灵活性,针对用户给出的提示的信息不够丰富,并且不能自定义消息对话框里面的按钮提示信息。因此推荐第一种写法。
- <span style="font-size:18px;">#include <QMessageBox>
-
- void MessageShow()
- {
- QMessageBox::StandardButton reply;
- reply = QMessageBox::critical(this,tr("QMessageBox::cirtical()"),
- MESSAGE,QMessageBox::Abort | QMessageBox::Retry | QMessageBox::Ignore);
-
- if(reply == QMessageBox::Abort)
- {
- criticalLabel->setText(tr("Abort"));
- }
- else if(reply == QMessageBox::Retry)
- {
- criticalLabel->setText(tr("Retry"));
- }
- else
- {
- criticalLabel->setText(tr("Ignore"));
- }
- } </span>
这个例子是使用AMessageBox类的静态方法,后面的例子中就是采用“基于属性”的API方法。
QFileDialog类:
QFileDialog类提供了允许用户选择文件或者目录的对话框。
QFileDialog类允许用户在它们的文件系统上遍历来选择一个或多个文件或目录。
最简单的方式是使用静态函数来创建一个QFileDialog。在Windows上,这些静态函数将调用本地Windows文件对话框并且在Mac OS X上,这些静态函数将调用本地Mac OS X文件对话框。
- <span style="font-size:18px;"> QString s = QFileDialog::getOpenFileName(
- "/home",
- "Images (*.png *.xpm *.jpg)",
- this,
- "open file dialog"
- "Choose a file" );</span>
在上面的实例中,一个模式对话框被使用静态函数来创建。开始目录被设置为“/home”。文件过滤器被设置为“Images (*.png *.xpm *.jpg)”。文件对话框的父对象被设置为this并且它被给定一个标识名称——“open file dialog”。文件对话框上面的标题被设置为“Choose a file”。
文档传送门
QFontDialog类:
标准字体对话框,一种是使用QFontDialog类的构造函数,一种是使用QFrontDialog类的静态使用方法getFont()
实例:
- <span style="font-size:18px;"> bool ok;
- QFont font = QFontDialog::getFont(
- &ok, QFont( "Helvetica [Cronyx]", 10 ), this );
- if ( ok ) {
-
- } else {
-
- }</span>
对话框也可以被用来直接设置窗口部件的字体:
myWidget.setFont( QFontDialog::getFont( 0, myWidget.font() ) );
如果用户点击OK,它们选择的字体将被myWidget使用,并且如果点击Cancel,最初的字体被使用。
也可以参考QFont、QFontInfo、QFontMetrics和对话框类。
QPageSetupDialog类:
不是很主流的类,配置与页相关的打印机选项
文档传送门
QProgressDialog类:
QProgressDialog类提供了慢操作的进度的反馈。
进度对话框用于给用户这个操作还要有多长时间的指示,并且证明这个应用程序还没有冻结。它也给用于一个中止这个操作运行的机会。
这里有使用QProgressDialog的两种方法:模式和非模式。
对于程序员,使用模式QProgressDialog是更简单的,但是你必须调用qApp->processEvents()来保持事件循环的运行来确保应用程序没有冻结。在循环中执行这个操作,在间隔中调用setProgress(),并且检查wasCancelled()的取消。例如:
- QProgressDialog progress( "Copying files...", "Abort Copy", numFiles,
- this, "progress", TRUE );
- for ( int i = 0; i < numFiles; i++ ) {
- progress.setProgress( i );
- qApp->processEvents();
-
- if ( progress.wasCancelled() )
- break;
-
- }
- progress.setProgress( numFiles );
非模式进度对话框适合发生在后台的操作,用户还可以和应用程序进行交互。这样的操作通常是基于QTimer(或者QObject::timerEvent())、QSocketNotifier或QUrlOperator,或者在一个独立的进度中执行。你的主窗口的状态条中的QProgressBar常常可以做为模式进度对话框的替代。
你需要拥有一个正在运行的时间循环,把cancelled()信号和停止这个操作的槽连接起来,并且在间隔中调用setProgress()。例如:
- Operation::Operation( QObject *parent = 0 )
- : QObject( parent ), steps( 0 )
- {
- pd = new QProgressDialog( "Operation in progress.", "Cancel", 100 );
- connect( pd, SIGNAL(cancelled()), this, SLOT(cancel()) );
- t = new QTimer( this );
- connect( t, SIGNAL(timeout()), this, SLOT(perform()) );
- t->start( 0 );
- }
-
- void Operation::perform()
- {
- pd->setProgress( steps );
-
- steps++;
- if ( steps > pd->totalSteps() )
- t->stop();
- }
-
- void Operation::cancel()
- {
- t->stop();
-
你可以通过使用setLabel()、setBar()和setCancelButton()用自定制的窗口部件来替换子窗口部件来定制这两种进度对话框。
也可以参考QDialog、QProgressBar、图形用户界面设计手册:进度指示器和Dialog Classes。
下面是例子的源代码
qbuiltingdlg.h
- #ifndef QBUILTINDLG_H
- #define QBUILTINDLG_H
-
- #include <QMainWindow>
- #include <QApplication>
- #include <QPushButton>
- #include <QDialog>
- #include <QGridLayout>
- #include <QWidget>
- #include <QHBoxLayout>
- #include <QLabel>
- #include <QTextEdit>
- #include <QLineEdit>
- #include <QComboBox>
- #include <QDialogButtonBox>
- #include <QGridLayout>
- #include <QDialog>
- #include <QtGui>
-
- namespace Ui {
- class QBuiltinDlg;
- }
-
- class QTextEdit;
- class QPushButton;
- class QBuiltinDlg : public QDialog
- {
- Q_OBJECT
- public:
- explicit QBuiltinDlg(QWidget* parent = 0);
- virtual ~QBuiltinDlg();
-
- private:
-
- QTextEdit* displayTextEdit;
- QPushButton* colorPushBtn;
- QPushButton* errorPushBtn;
- QPushButton* filePushBtn;
- QPushButton* fontPushBtn;
- QPushButton* inputPushBtn;
- QPushButton* pagePushBtn;
- QPushButton* progressPushBtn;
- QPushButton* printPushBtn;
-
- private slots:
- void doPushBtn();
- private:
- Ui::QBuiltinDlg *ui;
- };
-
- #endif // QBUILTINDLG_H
qbuiltindlg.cpp
中间有很多注释用于解释,详细的内容可以看文档
- #include "qbuiltindlg.h"
- #include "ui_qbuiltindlg.h"
-
- QBuiltinDlg::QBuiltinDlg(QWidget *parent) :
- QDialog(parent),
- ui(new Ui::QBuiltinDlg)
- {
- displayTextEdit = new QTextEdit(tr("The standard text edit of QT"));
- QGridLayout* gridLayout = new QGridLayout;
- colorPushBtn = new QPushButton(tr("Color Dialog"));
- errorPushBtn = new QPushButton(tr("Error Message"));
- filePushBtn = new QPushButton(tr("File Dialog"));
- fontPushBtn = new QPushButton(tr("Front Dialog"));
- inputPushBtn = new QPushButton(tr("Input Dialog"));
- pagePushBtn = new QPushButton(tr("PageSet Dialog"));
- progressPushBtn = new QPushButton(tr("Process Dialog"));
- printPushBtn = new QPushButton(tr("Printer Dialog"));
- gridLayout->addWidget(colorPushBtn, 0, 0, 1, 1);
- gridLayout->addWidget(errorPushBtn, 0, 1, 1, 1);
- gridLayout->addWidget(filePushBtn, 0, 2, 1, 1);
- gridLayout->addWidget(fontPushBtn, 1, 0, 1, 1);
- gridLayout->addWidget(inputPushBtn, 1, 1, 1, 1);
- gridLayout->addWidget(pagePushBtn, 1, 2, 1, 1);
- gridLayout->addWidget(progressPushBtn, 2, 0, 1, 1);
- gridLayout->addWidget(printPushBtn, 2, 1, 1, 1);
- gridLayout->addWidget(displayTextEdit, 3, 0, 3, 3);
-
- connect(colorPushBtn, SIGNAL(clicked()), this, SLOT(doPushBtn()));
- connect(errorPushBtn, SIGNAL(clicked()), this, SLOT(doPushBtn()));
- connect(filePushBtn, SIGNAL(clicked()), this, SLOT(doPushBtn()));
- connect(fontPushBtn, SIGNAL(clicked()), this, SLOT(doPushBtn()));
- connect(inputPushBtn, SIGNAL(clicked()), this, SLOT(doPushBtn()));
- connect(pagePushBtn, SIGNAL(clicked()), this, SLOT(doPushBtn()));
- connect(progressPushBtn, SIGNAL(clicked()), this, SLOT(doPushBtn()));
- connect(printPushBtn, SIGNAL(clicked()), this, SLOT(doPushBtn()));
-
- setWindowTitle(tr("Builtin"));
- resize(400, 300);
- setLayout(gridLayout);
- }
-
- QBuiltinDlg::~QBuiltinDlg()
- {
- delete ui;
- }
-
- void QBuiltinDlg::doPushBtn()
- {
-
- QPushButton* btn = qobject_cast<QPushButton*>(sender());
-
- if(btn == colorPushBtn)
- {
- QPalette palette = displayTextEdit->palette();
- const QColor& color = QColorDialog::getColor(palette.color(QPalette::Base), this);
- if(color.isValid())
- {
- palette.setColor(QPalette::Base, color);
- displayTextEdit->setPalette(palette);
-
- }
- }
-
- else if(btn == errorPushBtn)
- {
- QErrorMessage box(this);
- box.setWindowTitle(tr("Error Message"));
- box.showMessage(tr("Error 1"));
- box.showMessage(tr("Error 2"));
- box.showMessage(tr("Error 3"));
- box.showMessage(tr("Error 4"));
- box.showMessage(tr("Error 5"));
- box.exec();
- }
-
- else if(btn == filePushBtn)
- {
- QString fileName = QFileDialog::getOpenFileName(this,tr("open the file"),"/home/czm",
- tr("All files(*.*)"";;text files(*.txt)"";;XML files(*.xml)"));
- displayTextEdit->setText(fileName);
- }
-
- else if(btn == fontPushBtn)
- {
- bool ok;
- const QFont& font = QFontDialog::getFont(&ok, displayTextEdit->font(),this,tr("字体对话框"));
- if(ok)
- {
- displayTextEdit->setFont(font);
- }
- }
-
- else if(btn == inputPushBtn)
- {
- bool ok;
- QString text = QInputDialog::getText(this,tr("InputDialog"),tr("Please Input text"),
- QLineEdit::Normal,QDir::home().dirName(),&ok);
- if(ok && !text.isEmpty())
- {
- displayTextEdit->setText(text);
- }
- }
-
- else if(btn == pagePushBtn)
- {
- QPrinter printer;
- QPageSetupDialog dlg(&printer, this);
- dlg.setWindowTitle(tr("PageSet Dialog"));
- if (dlg.exec() == QDialog::Accepted)
- {
-
- }
- }
-
- else if(btn == progressPushBtn)
- {
- QProgressDialog progress(tr("Coping..."), tr("Cancel"),0,10000,this);
- progress.setWindowModality(Qt::WindowModal);
- progress.setWindowTitle(tr("Process Dialog"));
- progress.show();
- for(int i=0; i<10000; i++)
- {
- progress.setValue(i);
- qApp->processEvents();
- if(progress.wasCanceled())
- break;
-
- qDebug() << i;
- }
- progress.setValue(10000);
- }
-
- else if(btn == printPushBtn)
- {
- QPrinter printer;
- QPrintDialog dlg(&printer, this);
- dlg.setWindowTitle(tr("Printer Dialog"));
- if (dlg.exec() == QDialog::Accepted)
- {
-
- }
- }
-
- }
main.cpp
- #include <QApplication>
- #include "qbuiltindlg.h"
-
- int main(int argc, char *argv[])
- {
- QApplication a(argc, argv);
- QBuiltinDlg w;
- w.show();
-
- return a.exec();
- }
补充阅读:
关于Qt调色板类QPalette
QPalette类包含了Qt窗口部件的颜色组(color group):
— Active组,该组的颜色用于当前活跃的(active)窗口,即具有键盘或鼠标焦点的窗口;
— Inactive组,该组用于其他的窗口;
— Disabled组,该组用于状态为不可用的(disabled)的子窗口部件(不包含窗口)。
所有Qt窗口部件都拥有一个调色板并使用它绘制自己。通常,活跃状态的窗口的标题栏显示为蓝色的,而非活跃(inactive)状 态的窗口的标题栏显示为灰色的;活跃状态的窗口和非活跃状态的窗口都可以包含状态为不可用的窗口部件,一个不可用的窗 口部件(包括该窗口部件包含的子窗口部件)显示为灰色的,用户是无法与它进行交互的。通过改变窗口部件的调色板的各个 组中的颜色,能够改变窗口部件的显示颜色,比如改变背景色、文本颜色等。
可以通过QWidget::palette()获取一个窗口部件的调色板,然后通过QWidget::setPalette()函数为该窗口部件设置修改后的调色板。 或者通过QApplication::palette() 函数获取应用程序的调色板,并通过QApplication::setPalette() 为该应用程序设置修改后的调色 板。修改一个窗口部件的调色板只会影响到该窗口部件以及子窗口部件(不包含子窗口);而改变一个应用程序的调色板将会 影响到该应用程序的所有窗口部件。当对一个窗口部件的调色板已经作了修改后,再对其父窗口部件调色板的修改不会影响到该窗口部件的调色板;同样,对应用程序调色板的修改不会影响已经单独做出了调色板修改的窗口部件。
调色板类QPallete提供了颜色角色(color roles)概念,是指当前GUI界面中颜色的职责,通过枚举变量QPalette::ColorRole来定 义,比较常用的颜色角色有:
— QPalette::Window,通常指窗口部件的背景色;
— QPalette::WindowText,通常指窗口部件的前景色;
— QPalette::Base,指文本输入窗口部件(比如QTextEdit、QLineEidt等)的背景色
— QPalette::Text,与QPalette::Base一块使用,指文本输入窗口部件的前景色;
— QPalette::Button,指按钮窗口部件的背景色;
— QPalette::ButtonText,指按钮窗口部件的前景色。
http://blog.csdn.net/u013007900/article/details/43226283
QT学习 之 对话框 (四) 字体对话框、消息对话框、文件对话框、进程对话框(超详细中文注释)
原文:http://www.cnblogs.com/findumars/p/5107742.html