前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >8.QT-对话框(模态与非模态)

8.QT-对话框(模态与非模态)

作者头像
诺谦
发布2018-05-28 15:37:41
1.9K0
发布2018-05-28 15:37:41
举报
文章被收录于专栏:Linux驱动Linux驱动

对话框介绍

  • 对话框是于用户进行简易交互的顶层窗口
  • QDialog是Qt中所有对话框窗口的父类,是一种容器类型的组件
  • QDialog继承于QWidget类,如下图所示:

QWidget和QDialog有什么不同

QDialog:

  • QDialog是定制了窗口式样的特殊的QWidget
  • QDialog只能作为专用的交互窗口
  • QDialog不能作为子部件,嵌入其它容器中

QWidget:

  • QWidget如果没有父组件,则将会成为一个主窗口,
  • QWidget如果有父组件,则将成为其父组件的子部件,嵌入到其父组件里

代码试验: QWidget和QDialog区别

代码1:

代码语言:javascript
复制
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QWidget w;
    w.resize(300,300);

    QDialog d(&w);
    d.resize(150,150);

    w.show();
    d.show();

    return a.exec();
}

效果:

可以看到,对话框始终都是作为独立的交互窗口

代码2:

代码语言:javascript
复制
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QWidget w1;
    w1.resize(300,300);

    QWidget w2(&w1);
    w2.resize(150,150);

    w1.show();
    w2.show();

    return a.exec();
}

效果:

可以看到只出现了一个窗口,并没有出现第二个窗口

对话框类型

模态对话框

  • 属于阻塞式调用,指没有关闭该对话框之前,是无法与其它任何窗口进行交互的
  • 用于依赖用户选择的场合,比如:选项设置,消息提示,字体设置等
  • 在栈上创建模态对话框是最简单常用的方式
  • 使用exec()进入对话框的消息循环,从而实现阻塞式调用

实验代码:

代码语言:javascript
复制
int main(int argc, char *argv[])
{

    QApplication a(argc, argv);

    QWidget w;
    w.resize(300,300);
    w.show();

    QDialog  d(&w);
    d.resize(150,150);
    d.exec();         //进入对话框d的消息循环,从而实现阻塞式调用

    return a.exec();
}

非模态对话框  

  • 属于非阻塞调用,指出现该对话框时,也可以与父窗口进行交互
  • 用于特殊功能设置的场合,比如:查找操作
  • 一般情况下非模态对话框需要在堆上创建,避免自动被摧毁
  • 非模态对话框需要通过setAttribute()成员函数指定Qt::WA_DeleteOnClose属性
  • Qt::WA_DeleteOnClose表示:退出窗口后,让Qt自动摧毁这个对话框
  • 使用show()来显示对话框窗口,从而实现非阻塞调用

实验代码:

代码语言:javascript
复制
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QWidget w;
    w.resize(300,300);
    w.show();

    QDialog  *d = new QDialog(&w);

    d->setAttribute(Qt::WA_DeleteOnClose);
    d->resize(150,150);
    d->show();                

    return a.exec();
}

混合模态对话框

  • 在非模态对话框的基础上调用QDialog::setModal(true)成员函数实现

实验代码:

代码语言:javascript
复制
int main(int argc, char *argv[])
{

    QApplication a(argc, argv);

    QWidget w;
    w.resize(300,300);
    w.show();

    QDialog  *d = new QDialog(&w);
    d->setAttribute(Qt::WA_DeleteOnClose);
    d->setModal(true);               
    d->resize(150,150);
    d->show();

    return a.exec();
}

对话框返回值处理

  • 只有模态对话框才有返回值概念
  • QDialog::exec()的返回值作为交互结果

 -使用void QDialog::done ( int r ) 作为交互结果,将r值返回给exec()

  -返回值为QDialog::Accepted时,表示用户操作成功

  -返回值为QDialog::Rejected时,表示用户操作失败

  -也可以自定义返回数值

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-04-23 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档