Qt中的对话框(一)

对话框概述:
对话框是 GUI 程序中不可或缺的组成部分。很多不能或者不适合放入主窗口的 功能组件都必须放在对话框中设置。对话框通常会是一个顶层窗口,出现在程序 最上层,用于实现短期任务或者简洁的用户交互。
Qt中对话框实现使用的是 QDialog 类。就像主窗口一样,我们通常会设计一个类继 承 QDialog。
关于QDialog(及其子类,以及所有 Qt::Dialog 类型的类)其 parent 指针:
如果 parent 为 NULL,则该对话框会作为一个顶 层窗口,否则则作为其父组件的子对话框(此时,其默认出现的位置是 parent 的中心)。顶层窗口与非顶层窗口的区别在于,顶层窗口在任务栏会有自己的位 置,而非顶层窗口则会共享其父组件的位置。
模态对话框和非模态对话框
模态对话框:
就是会阻塞同一应用程序中其它窗口的输入。 模态对话框很常见,比如“打开文件”功能。你可以尝试一下记事本的打开 文件,当打开文件对话框出现时,我们是不能对除此对话框之外的窗口部分 进行操作的。
非模态对话框:
例如查找对话框,我们可以在显示着查找对话 框的同时,继续对记事本的内容进行编辑,并不会阻塞应用程序对其他窗口的输入
1,标准对话框
所谓标准对话框,是 Qt 内置的一系列对话框,用于简化开发。事实上,有很多 对话框都是通用的,比如打开文件、设置颜色、打印设置等。这些对话框在所有 程序中几乎相同,因此没有必要在每一个程序中都自己实现这么一个对话框。
Qt 的内置对话框大致分为以下几类

QColorDialog:	选择颜色;
QFileDialog:	选择文件或者目录;
QFontDialog:	选择字体;

QInputDialog:	允许用户输入一个值,并将其值返回;
QMessageBox:	模态对话框,用于显示信息、询问问题等;
QPageSetupDialog:	为打印机提供纸张相关的选项;
QPrintDialog:	打印机配置;
QPrintPreviewDialog:打印预览;
QProgressDialog:	显示操作过程。

2,自定义模态对话框
在Qt中有两种模态对话框:应用程序级别和窗口级别
应用程序级别的模态:
当该种模态的对话框出现时,用户必须首先对对话框进行交互,直到关闭对话框,然后才能访问程序中其他的窗口。
窗口级别的模态:
该模态仅仅阻塞与对话框关联的窗口,但是依然允许用户与程序中其它窗口交互。窗口级别的模态尤其适用于多窗口模式。
使用exec()函数实现应用程序级别模态对话框

    QDialog *dialog = new QDialog(this);
    dialog->setWindowTitle("模态对话框");
    dialog->setAttribute(Qt::WA_DeleteOnClose);//设置关闭对话框自动释放
    dialog->exec();

setAttribute()函数设置对话框关闭时,自动销毁对话框。
注:也可以使用open函数实现窗口级别的模态对话框
3,自定义非模态对话框
使用 QDialog::show()实现非模态对话框

    QDialog *dialog2 = new QDialog(this);
    dialog2->setWindowTitle("非模态对话框");
    dialog2->setAttribute(Qt::WA_DeleteOnClose);//设置关闭对话框自动释放
    dialog2->show();

setAttribute()函数设置对话框关闭时,自动销毁对话框。
需要注意的是,我们在实现非模态对话框的时候如果不是在堆上开辟空间,而是定义了临时变量,这个对话框就会一闪而过,因为在函数执行完成后是自动直接释放变量
如下:

QDialog dialog2 ;
dialog2.setWindowTitle("非模态对话框");
dialog2.show();

所以在实现非模态对话框的时候注意变量的存活周期。
4,消息对话框
QMessageBox 用于显示消息提示。我们一般会使用其提供的几个 static 函数:
1>显示关于对话框

void about(QWidget * parent, const QString & title, const QString & text)

/*参数说明*/
/*1,指定父窗口
2,指定文本标题
3,关于文本*/

/*显示关于 Qt 对话框。该对话框用于显示有关 Qt 的信息。*/
void aboutQt(QWidget * parent, const QString & title = QString());

如下:

 QMessageBox::about(this,"关于对话框","关于提示");

注:关于对话框是一个模态对话框
2>严重错误对话框

/*显示严重的错误对话框*/
StandardButton critical(QWidget * parent, const QString & title,const QString & text, StandardButtons buttons = Ok,StandardButton defaultButton = NoButton);

/*参数说明*/
/*
1,父窗口
2,标题
3,文本内容
4,选择的按键(Ok或者Yes等)默认情况下只有一个 Ok 按钮, 我们可以使用StandardButtons 类型指定多种按钮。
*/

如下:

QMessageBox::critical(this,"错误对话框","错误提示",QMessageBox::Cancel);

在这里插入图片描述
3>其他对话框
信息对话框
提供一个普通的信息图标

StandardButton information(QWidget * parent, const QString & title,
const QString & text, StandardButtons buttons = Ok,
StandardButton defaultButton = NoButton)

问题对话框用来进性选择的最后可以获取选择结果进行判断

StandardButton question(QWidget * parent, const QString & title,
const QString & text,
StandardButtons buttons = StandardButtons( Yes | No ), StandardButton defaultButton = NoButton)

如下:

 QMessageBox::StandardButton ret = QMessageBox::question(this,"问题对话框","提示",QMessageBox::Ok|QMessageBox::No);
    
    if(ret == QMessageBox::Ok)
    {
        /*选择了Ok*/
        
    }else if(ret == QMessageBox::No)
    {
        
        /*现在了No*/
    }

执行结果
在这里插入图片描述
警告对话框
黄色的警告图标

StandardButton warning(QWidget * parent, const QString & title,
const QString & text, StandardButtons buttons = Ok,
StandardButton defaultButton = NoButton)

在使用QMessageBox的时候虽然方便,但是有时候我们需要一些别的属性,现在就需要调用它的属性API来实现
一个简单询问保存文件例子

  	/*定义变量*/
    QMessageBox msgBox;
    /*设置文本*/
    msgBox.setText(tr("文件已经被修改"));
    /*设置详细文本*/
    msgBox.setInformativeText(tr("保存文件?"));
    /*设置详细信息, 添加一显示详情按钮*/
    msgBox.setDetailedText(tr("显示详情>>>>>"));
    /*设置选择的按钮*/
    msgBox.setStandardButtons(QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel);
    /*默认按钮*/
    msgBox.setDefaultButton(QMessageBox::Save);

    int ret = msgBox.exec();
    switch (ret)
    {
    case QMessageBox::Save:
        qDebug() << "Save document!"; break;

    case QMessageBox::Discard:
        qDebug() << "Discard changes!"; break;

    case QMessageBox::Cancel:
        qDebug() << "Close document!"; break;
    }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值