关于Qt中QDialog的标准对话框,之前已经介绍了颜色、文件选择、字体、输入对话框四种标准对话框,本篇主要讲解消息、进度、错误信息三种对话框的基本使用,而关于向导对话框相关介绍,如果本人之后有更深的理解将会进行详细介绍。
一、消息对话框
颜色对话框由QMessageBox类提供,因此需要头文件中需要包含#include<QMessageBox>。消息色对话框可以通过调用静态函数和创建对象两种形式实现。消息对话框一般包括关于对话框、信息对话框、问题对话框、警告对话框、严重错误对话框五种类型,创建对象方式实现代码如下:
void QDialoglearn::on_pushButtonMessageBox_clicked()
{
//创建对象
QMessageBox myMesBox;
//关于对话框,关于对话框没有返回值;
myMesBox.about(this, QString::fromLocal8Bit("关于对话框"),\
QString::fromLocal8Bit("易码码的Qt大坑"));
//信息对话框
int ret=myMesBox.information(this, QString::fromLocal8Bit("信息对话框"), \
QString::fromLocal8Bit("文艺不灭,二逼永存!"),QMessageBox::Yes);
if (ret == QMessageBox::Yes)
{
ui.labelDebug->setText(QString::number(ret));
}
//问题对话框
ret = myMesBox.question(this, QString::fromLocal8Bit("问题对话框")\,
QString::fromLocal8Bit("lena,写代码文艺吗!"), QMessageBox::Yes, \
QMessageBox::Yes, QMessageBox::Yes);
if (ret == QMessageBox::Yes)
{
ui.labelDebug->setText(QString::number(ret));
}
//警告对话框
ret = myMesBox.warning(this, QString::fromLocal8Bit("警告对话框"), \
QString::fromLocal8Bit("警告:你已经犯二!为避免电脑中毒将自动关闭电脑!"),\
QMessageBox::Yes, QMessageBox::No);
if (ret == QMessageBox::No)
{
ui.labelDebug->setText(QString::number(ret));
}
//严重错误对话框
ret = myMesBox.critical(this, QString::fromLocal8Bit("严重错误对话框"),\
QString::fromLocal8Bit("严重错误提示:糟糕,电脑自动无法关闭,请手动拔电源!"),\
QMessageBox::Yes, QMessageBox::YesToAll);
if (ret == QMessageBox::Yes || ret == QMessageBox::YesToAll)
{
myMesBox.about(this, QString::fromLocal8Bit("关于对话框"), \
QString::fromLocal8Bit("说话算话呀,谁不拔电源谁是光头强!"));
}
}
以上不同类型的对话框所调用的函数基本包含四个参数:父窗口指针,标题栏,显示信息,拥有的按钮。代码实现效果如下:
五种消息对话框中除了关于对话框没有返回值之外,其余四种均有返回值,返回值与有选择按钮相关由QMessageBox::StandardButton枚举类型指定,可根据返回值的不同选择执行对应的代码。其中QT中:StandardButton枚举的定义如下:
enum StandardButton {
// keep this in sync with QDialogButtonBox::StandardButton and QPlatformDialogHelper::StandardButton
NoButton = 0x00000000,
Ok = 0x00000400,
Save = 0x00000800,
SaveAll = 0x00001000,
Open = 0x00002000,
Yes = 0x00004000,
YesToAll = 0x00008000,
No = 0x00010000,
NoToAll = 0x00020000,
Abort = 0x00040000,
Retry = 0x00080000,
Ignore = 0x00100000,
Close = 0x00200000,
Cancel = 0x00400000,
Discard = 0x00800000,
Help = 0x01000000,
Apply = 0x02000000,
Reset = 0x04000000,
RestoreDefaults = 0x08000000,
FirstButton = Ok, // internal
LastButton = RestoreDefaults, // internal
YesAll = YesToAll, // obsolete
NoAll = NoToAll, // obsolete
Default = 0x00000100, // obsolete
Escape = 0x00000200, // obsolete
FlagMask = 0x00000300, // obsolete
ButtonMask = ~FlagMask // obsolete
};
二、进度对话框
错误对话框由QProgressDialog类提供,因此需要头文件中需要包含#include<QProgressDialog>。进度对话框可以通过创建对象形式实现。
void QDialoglearn::on_pushButtonProgress_clicked()
{
int maxVal = 50000;
//1、利用构造函数进行初始化参数
//QProgressDialog myProgressDlg( QString::fromLocal8Bit("光头强砍树进度"), QString::fromLocal8Bit("取消"),0,maxVal,this);
//2、利用成员函数设置窗口参数;
QProgressDialog myProgressDlg;
myProgressDlg.setLabelText(QString::fromLocal8Bit("光头强砍树进度"));
myProgressDlg.setMinimum(0);
myProgressDlg.setMaximum(maxVal);
//myProgressDlg.exec();//模态显示,阻塞代码和界面,不可用;
myProgressDlg.setModal(true); //设置为模态对话框,阻塞界面但不阻塞代码;
//或者采用myProgressDlg.setWindowModality(Qt::ApplicationModal);
myProgressDlg.show();
int i = 0;
int maxVal1 = maxVal + 1;
for (i; i < (maxVal1); ++i)
{
myProgressDlg.setValue(i);
QCoreApplication::processEvents();
if (myProgressDlg.wasCanceled())
break;
}
if (i<maxVal)
{
QMessageBox::about(this, QString::fromLocal8Bit("警告!"),\
QString::fromLocal8Bit("光头强快砍树!"));
}
else
{
QMessageBox::about(this, QString::fromLocal8Bit("恭喜!"), \
QString::fromLocal8Bit("恭喜小强砍树完成!"));
}
}
注意代码中进度对话框模态和非模态的设置;代码中的QCoreApplication::processEvents();是为了避免长时间的操作导致用户界面冻结;
以上代码调用如下对话框,并根据是否取消进度弹出不同的消息提示对话框:
除QProgressDialog外,QProgressBar类提供进度条部件的设置;
三、错误对话框
错误对话框由QErrorMessage类提供,因此需要头文件中需要包含#include<QErrorMessage>。错误对话框可以通过创建对象形式实现。
void QDialoglearn::on_pushButtonErrorMessage_clicked()
{
QErrorMessage* myerrorDlg=new QErrorMessage(this);
myerrorDlg->setWindowTitle(QString::fromLocal8Bit("错误信息对话框"));
//显示非模态对话框;
myerrorDlg->showMessage(QString::fromLocal8Bit("出现XXXX错误,请找开发人员回炉重造!"));
}
代码调用错误对话框如下:
错误对话框中哟一个默认的show this message again 的复选框,可以选择是否提示相同的错误。但如果要确保该复选框生效请确保错误对话框对象为全局变量。以上代码中 myerrorDlg为局部变量,因此复选框无效。
四、参考资料
1、《Qt creater 快速入门》