为了方便程序员进行某些特定功能对话框的编程,Qt提供了一套标准的通用对话框。这些内建的对话框都提供了一些便于使用的静态函数。在windows系统上,这些静态函数将会调用本地的windows对话框;而在Mac OS X系统下,这些静态函数将会调用本地的Mac OS X对话框。
Qt提供的内建对话框有:
1、颜色对话框QColorDialog,能够允许用户选择颜色;
2、错误消息框QErrorMessage,显示错误信息;
3、文件对话框QFileDialog,能够允许用户选择一个或多个文件以及目录;
4、字体对话框QFontDialog,允许用户选择/设置字体;
5、输入对话框QInputDialog,允许用户进行简单的输入,比如输入一行文本或者一个数字等;
6、页设计对话框QPageSetupDialog,配置与页相关的打印机选项;
7、进度对话框QProgressDialog,指示一个长时间操作的工作进度,以及用户该操作是否已经停滞;
8、打印对话框QPrintDialog,配置打印机。可以允许用户选择可用的打印机,以及允许用户设置文档相关的设置(例如,纸张大小以及方向等),打印类型(彩色打印或黑白打印)、页码范围和打印的份数等;
9、QMessageBox消息框。
使用内建对话框实例:
1、用qt creator创建一个名为builtin的empty qt project工程;
2、在工程中添加builtindlg.h,builtindlg.cpp,builtin.cpp文件,代码如下:
T qobject_cast(QObject* object)
完成类型的转换,将<QObject*>类型的对象指针转换为类型为<T *>的对象指针,如果转换成功,返回正确的对象指针,否则返回0。(类型T必须是直接或间接继承自QObject的类,并且在该类的定义里有Q_OBJECT宏变量,否则qobject_cast()函数的返回值是未定义的。)
1、创建颜色对话框的代码解析
1.1 QTextEdit::palette()获取文本编辑框对象displayTextEdit的调色板;
1.2 用QColorDialog::getColor()函数创建并显示一个模态的颜色对话框,并返回用户选择的颜色对象的常量引用赋给变量color;如果用户点击“取消”按钮,颜色对话框将返回一
个无效的颜色;颜色对话框的颜色初始化为palette.color(QPalette::Base),即文本编辑框的背景色;父窗口部件为this。
1.3 QColor::isValid()函数判断颜色对话框返回的颜色是否有效。
-〉若有效,函数QPalette::setColor()设置调色板的背景颜色为颜色对话框返回的颜色;
-〉此处的QPalette::setColor()有两个参数,第一个参数QPalette::Base指定了调色板的角色,告诉程序应该设置调色板的所有三个颜色组中的哪一个角色的颜色;第二个参数color指定应该设置的颜色。
1.4 函数QTextEdit::setPalette()重新设置文本编辑框的调色板。
2、创建错误消息框的代码的解析
2.1 函数QErrorMessage::showMessage()功能是在错误消息框中显示错误信息。
3、文件对话框的代码的解析
3.1 函数QFileDialog::getOpenFileName()功能是获取用户选择的文件名并显示在文本编辑框中。
3.2 该函数在此处有4个参数:
第1个参数指定文件对话框的父窗口部件;
第2个参数指定文件对话框的标题;
第3个参数指定文件对话框的默认路径;
第4个参数指定了文件对话框的多个文件过滤器,过滤器之间通过两个分号“;;”间隔
4、字体对话框的代码的解析
4.1 函数QFontDialog::getFont()创建并显示一个字体对话框。此处有4个参数:
第1个参数是一个输入参数,用于标识用户的选择状态。单击“正确”ok变量为true;单击“取消”按钮ok变量为false;
第2个参数指定了对话框的初始颜色,当用户取消颜色的选择时,字体对话框将初始颜色作为返回值;
第3个参数指定了父窗口部件;
第4个参数制定了字体对话框的标题;
5、输入对话框的代码的解析
5.1 QInputDialog::getText()函数创建并显示一个文本输入对话框。这里有6个参数:
前2个参数分别指定了输入对话框的父窗口部件和对话框的标题;
第3个参数指定了标签的显示文本;
第4个参数指定了行编辑框QLineEdit输入内容的显示模式;
第5个参数制定了行编辑框默认的显示内容,函数QDir::home()返回用户的home路径,QDir::dirName()返回路径的名字;
第6个参数标识用户的选择状态,和函数QFontDialog::getFont()的第一个参数作用相同;
6、进度对话框的代码的解析
6.1 首先调用了QProgressDialog的构造函数,创建了一个进度对话框的栈对象。该构造函数有5个参数:
第一个参数是一个字符串,他指定了显示给用户的提示信息,表明当前正在进行的工作;
第2个参数指定了“取消”按钮的显示文本,如果该参数为0,进度对话框将没有“取消”按钮;
第3,4个参数分别指定了操作的步数,在这个实例中,假定进度对话框显示复制10000个文件的进展情况,第3个参数设定为0,第4个参数设定为10000,即这两个参数的差值决定了这个复制操作的步数为10000;
第5个参数指定了进度对话框的父窗口部件;
6.2 函数setWindowModality()设置进度对话框的类型为Qt::WindowModal,即模态对话框。
Qt提供的内建对话框有:
1、颜色对话框QColorDialog,能够允许用户选择颜色;
2、错误消息框QErrorMessage,显示错误信息;
3、文件对话框QFileDialog,能够允许用户选择一个或多个文件以及目录;
4、字体对话框QFontDialog,允许用户选择/设置字体;
5、输入对话框QInputDialog,允许用户进行简单的输入,比如输入一行文本或者一个数字等;
6、页设计对话框QPageSetupDialog,配置与页相关的打印机选项;
7、进度对话框QProgressDialog,指示一个长时间操作的工作进度,以及用户该操作是否已经停滞;
8、打印对话框QPrintDialog,配置打印机。可以允许用户选择可用的打印机,以及允许用户设置文档相关的设置(例如,纸张大小以及方向等),打印类型(彩色打印或黑白打印)、页码范围和打印的份数等;
9、QMessageBox消息框。
使用内建对话框实例:
1、用qt creator创建一个名为builtin的empty qt project工程;
2、在工程中添加builtindlg.h,builtindlg.cpp,builtin.cpp文件,代码如下:
builtindlg.h
#ifndef BUILTINDLG_H
#define BUILTINDLG_H
#include<QtGui/QDialog>
#include<QtGui/QGridLayout>
class QTextEdit;
class QPushButton;
class CBuiltinDlg:public QDialog
{
Q_OBJECT
public:
CBuiltinDlg(QWidget *parent=0);
virtual ~CBuiltinDlg(){}
private:
QTextEdit* displayTextEdit;
QPushButton* colorPushBtn;
QPushButton* errorPushBtn;
QPushButton* filePushBtn;
QPushButton* fontPushBtn;
QPushButton* inputPushBtn;
QPushButton* pagePushBtn;
QPushButton* progressPushBtn;
QPushButton* printPushBtn;
QPushButton* btn;
QGridLayout* gridLayout;
private slots:
void doPushBtn();
};
#endif // BUILTINDLG_H
builtindlg.cpp
#include<QtGui/QtGui>
#include"builtindlg.h"
CBuiltinDlg::CBuiltinDlg(QWidget* parent):QDialog(parent)
{
// 创建一个显示内容为“Qt的标准通用对话框。”的文本编辑框QTextEdit对象
displayTextEdit=new QTextEdit(tr("Qt的标准通用对话框。"));
//创建一个网格布局管理器gridLayout对象,然后将各个按钮对象添加到该布局管理器中
gridLayout=new QGridLayout;
colorPushBtn=new QPushButton(tr("颜色对话框"));
errorPushBtn=new QPushButton(tr("错误消息框"));
filePushBtn=new QPushButton(tr("文件对话框"));
fontPushBtn=new QPushButton(tr("字体对话框"));
inputPushBtn=new QPushButton(tr("输入对话框"));
pagePushBtn=new QPushButton(tr("页设计对话框"));
progressPushBtn=new QPushButton(tr("进度对话框"));
printPushBtn=new QPushButton(tr("打印对话框"));
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);
//将gridLayout设置为内建对话框CBuiltinDlg对象的顶层布局管理器
setLayout(gridLayout);
//将信号与槽关联起来
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("内建对话框"));
resize(400,300);
}
//重写槽函数doPushBtn()
void CBuiltinDlg::doPushBtn()
{
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("错误消息框"));
box.showMessage(tr("错误消息框实例xx。"));
box.showMessage(tr("错误消息框实例xx。"));
box.showMessage(tr("错误消息框实例xx。"));
box.showMessage(tr("错误消息框实例yy。"));
box.showMessage(tr("错误消息框实例zz。"));
box.exec();
}
else if(btn==filePushBtn)
{
//文件对话框
QString fileName=QFileDialog::getOpenFileName(this,tr("打开文件"),
"/home/czm",
tr("任何文件(*.*)"
";;文本文件(*.txt)"
";;XML文件(*.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("输入对话框"),
tr("输入文本:"),
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("页设置对话框"));
if(dlg.exec()==QDialog::Accepted)
{
//进行下一步的处理
}
}
else if(btn==progressPushBtn)
{
//进度对话框
QProgressDialog progress(tr("正在复制文件..."),
tr("取消"),
0,
10000,
this);
progress.setWindowModality(Qt::WindowModal);
progress.setWindowTitle(tr("进度对话框"));
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("打印对话框"));
if(dlg.exec()==QDialog::Accepted)
{
//进行下一步处理
}
}
}
注:曹函数的开头,首先是获取发送信号的QPushButton对象的指针。函数QObject:sender()返回发送信号的对象的指针,返回类型为QObject*。模板函数
T qobject_cast(QObject* object)
完成类型的转换,将<QObject*>类型的对象指针转换为类型为<T *>的对象指针,如果转换成功,返回正确的对象指针,否则返回0。(类型T必须是直接或间接继承自QObject的类,并且在该类的定义里有Q_OBJECT宏变量,否则qobject_cast()函数的返回值是未定义的。)
1、创建颜色对话框的代码解析
1.1 QTextEdit::palette()获取文本编辑框对象displayTextEdit的调色板;
1.2 用QColorDialog::getColor()函数创建并显示一个模态的颜色对话框,并返回用户选择的颜色对象的常量引用赋给变量color;如果用户点击“取消”按钮,颜色对话框将返回一
个无效的颜色;颜色对话框的颜色初始化为palette.color(QPalette::Base),即文本编辑框的背景色;父窗口部件为this。
1.3 QColor::isValid()函数判断颜色对话框返回的颜色是否有效。
-〉若有效,函数QPalette::setColor()设置调色板的背景颜色为颜色对话框返回的颜色;
-〉此处的QPalette::setColor()有两个参数,第一个参数QPalette::Base指定了调色板的角色,告诉程序应该设置调色板的所有三个颜色组中的哪一个角色的颜色;第二个参数color指定应该设置的颜色。
1.4 函数QTextEdit::setPalette()重新设置文本编辑框的调色板。
2、创建错误消息框的代码的解析
2.1 函数QErrorMessage::showMessage()功能是在错误消息框中显示错误信息。
3、文件对话框的代码的解析
3.1 函数QFileDialog::getOpenFileName()功能是获取用户选择的文件名并显示在文本编辑框中。
3.2 该函数在此处有4个参数:
第1个参数指定文件对话框的父窗口部件;
第2个参数指定文件对话框的标题;
第3个参数指定文件对话框的默认路径;
第4个参数指定了文件对话框的多个文件过滤器,过滤器之间通过两个分号“;;”间隔
4、字体对话框的代码的解析
4.1 函数QFontDialog::getFont()创建并显示一个字体对话框。此处有4个参数:
第1个参数是一个输入参数,用于标识用户的选择状态。单击“正确”ok变量为true;单击“取消”按钮ok变量为false;
第2个参数指定了对话框的初始颜色,当用户取消颜色的选择时,字体对话框将初始颜色作为返回值;
第3个参数指定了父窗口部件;
第4个参数制定了字体对话框的标题;
5、输入对话框的代码的解析
5.1 QInputDialog::getText()函数创建并显示一个文本输入对话框。这里有6个参数:
前2个参数分别指定了输入对话框的父窗口部件和对话框的标题;
第3个参数指定了标签的显示文本;
第4个参数指定了行编辑框QLineEdit输入内容的显示模式;
第5个参数制定了行编辑框默认的显示内容,函数QDir::home()返回用户的home路径,QDir::dirName()返回路径的名字;
第6个参数标识用户的选择状态,和函数QFontDialog::getFont()的第一个参数作用相同;
6、进度对话框的代码的解析
6.1 首先调用了QProgressDialog的构造函数,创建了一个进度对话框的栈对象。该构造函数有5个参数:
第一个参数是一个字符串,他指定了显示给用户的提示信息,表明当前正在进行的工作;
第2个参数指定了“取消”按钮的显示文本,如果该参数为0,进度对话框将没有“取消”按钮;
第3,4个参数分别指定了操作的步数,在这个实例中,假定进度对话框显示复制10000个文件的进展情况,第3个参数设定为0,第4个参数设定为10000,即这两个参数的差值决定了这个复制操作的步数为10000;
第5个参数指定了进度对话框的父窗口部件;
6.2 函数setWindowModality()设置进度对话框的类型为Qt::WindowModal,即模态对话框。
builtin.cpp
#include<QtGui/QtGui>
#include"builtindlg.h"
int main(int argc,char *argv[])
{
QApplication app(argc,argv);
QTextCodec::setCodecForTr(QTextCodec::codecForName("gb18030"));
CBuiltinDlg dlg;
return dlg.exec();
}