原文:https://blog.csdn.net/hl1hl/article/details/85244451

前言

在Qt开发桌面软件的过程中,根据开发的需求不同,我们经常需要将弹出窗口,一般常见的是需要是以下两种。

锁定弹出的窗口,阻塞其他窗口(包括主窗口)的操作,只有关闭当前窗口才能点击其他窗口或者主窗口

保持当前窗口一直显示在最顶层,但是不锁定(即同时可以操作其他窗口),同时也需要保证不影响其他程序

知识准备

首先我们需要了解一下 QMainWindow、QWidget、QDialog 的区别。

具体可以看以下链接,我只说下结论。

  • 如果需要嵌入至其他窗体中,则基于 QWidget 创建;

  • 如果是顶级对话框,则基于 QDialog 创建;

    • QDialog 又分为非模态对话框、模态对话框、半模态对话框
  • 如果是主窗体,则基于 QMainWindow 创建

    相信你看了上面的许多开发者就会知道自己的一个最基本的错误的:通过继承 QWidget 来创建弹出窗口,这个最基本的错误会导致你无法实现以上两点将窗口置顶以及其他不合理的Bug。

记住重要的一点,创建顶级(弹出)对话框,基于 QDialog 来创建。如果是弹出窗口基于 QWidget 来创建也没有关系,不需要重要修改太多,只需 setWindowflags(Qt::Dialog)

具体操作

一、针对第一种锁定弹出窗口

1、如果窗口是基于QDialog创建。

topWindow.setParent(this);//指定父窗口,一般是目前将你弹出的窗口
topWindow.exec();//模态

2、如果窗口是基于QWidget创建(不建议这么做)

topWindow->setWindowFlags(topWindow->windowFlags() |Qt::Dialog);
topWindow->setWindowModality(Qt::ApplicationModal); //阻塞除当前窗体之外的所有的窗体
topWindow->show();

二、设置窗口一直保持在顶层,但是不阻塞用户操作其他窗口

1、如果窗口是基于QDialog创建的

topWindow=new TopWindow(this);//指定父窗口
topWindow.show();//非模态

2、如果窗口是基于QWidget创建的(不建议)

topWindow.setParent(this);//指定父窗口
topWindow.setWindowFlags(topWindow.windowflags()| Qt::Dialog);
topWindow.show();

以上 topWindow 是窗体类新建的对象。

其他的窗口置顶方式

其实有其他将窗口置顶的方式,但是是对于所有程序的窗口都置顶。也就是说其他程序打开后也在被置顶的窗口所遮盖。

我所知道的有两种方式:

topWindow->setWindowFlags(topWindow->windowFlags() | Qt::WindowStaysOnTopHint);

或者

SetWindowPos(HWND(topWindow->winid()),HWND_TOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);

Qt保持窗口在最上方的更多相关文章

  1. [转] - 使用Qt作窗口截屏(含源码)

    截屏(screenshot),就是将屏幕上的东西拷贝下来存成图片文件.介绍的好像有点多余:(,那我们就直接切入正题. QPixmap提供了两个函数grabWidget和grabWindow可以将屏幕上 ...

  2. QT源码解析(一) QT创建窗口程序、消息循环和WinMain函数

    QT源码解析(一) QT创建窗口程序.消息循环和WinMain函数 分类: QT2009-10-28 13:33 17695人阅读 评论(13) 收藏 举报 qtapplicationwindowse ...

  3. C++框架_之Qt的窗口部件系统的详解-上

    C++框架_之Qt的窗口部件系统的详解-上 第一部分概述 第一次建立helloworld程序时,曾看到Qt Creator提供的默认基类只有QMainWindow.QWidget和QDialog三种. ...

  4. 【Qt】窗口居中显示

    w.move((a.desktop()->width() - w.width())/, (a.desktop()->height() - w.height())/); 上述方法可以置中,但 ...

  5. Qt的窗口的最大化。

    1.window.showFullScreen()//此方法只对顶级窗口有效,对子窗口无效 QT中窗口部件QWidget成员函数showFullScreen();是用于将窗口部件全屏显示,但是他只对窗 ...

  6. QT 主窗口和子窗口相互切换示例

    QT 主窗口和子窗口相互切换示例 文件列表: SubWidget.h #ifndef SUBWIDGET_H #define SUBWIDGET_H #include <QtWidgets/QW ...

  7. Qt子窗口QMidSubwindow全屏出现的问题总结

    我的需求:想全屏一个子窗口QMidSubwindow,禁止显示最大化最小化和关闭按钮. 我开始尝试的是网上介绍的方法,把结果展现给大家一下,最后再总结: 方法1:QMidSubwindow直接调用sh ...

  8. Qt 子窗口监听主窗口信号

    Qt 子窗口监听主窗口信号(转载)  原文链接:https://www.cnblogs.com/ybqjymy/p/12169762.html 1 MainWindow *ptr = NULL; 2 ...

  9. Qt多窗口编程详解

    常用的窗体基类是 QWidget.QDialog 和 QMainWindow,在创建 GUI 应用程序时选择窗体基类就是从这 3 个类中选择. QWidget 直接继承于 QObject,是 QDia ...

随机推荐

  1. yum 下载全量依赖 rpm 包及离线安装(终极解决方案)

    目录 简介 验证环境 查看依赖包 方案一(推荐):repotrack 方案二:yumdownloader 方案三:yum 的 downloadonly 插件 离线安装 rpm 参考资料 简介 通常生产 ...

  2. DataGridView行号发生变化 使用的事件

    DataGridView并没有这么专门为行号发生变化时触发的事件,我们只能用SelectionChanged和CurrentCellChanged做些设置后实现. 1.使用SelectionChang ...

  3. 常用vscode 插件第一季

    VSCODE 常用插件第一季 1.chinese 此插件中文(简体)语言包为 VS Code 提供本地化界面. https://marketplace.visualstudio.com/items?i ...

  4. HashMap之KeySet分析

    本篇涵盖 1.HashMap并不是用keySet来存储key的原因及证明 2.keySet方法返回后的remove.add操作原理 一.方法作用 概括一下 1.keySet方法返回map中包含的键的集 ...

  5. G - GCD and LCM 杭电

    Given two positive integers G and L, could you tell me how many solutions of (x, y, z) there are, sa ...

  6. 我是如何一步步的在并行编程中将lock锁次数降到最低实现无锁编程

    在并行编程中,经常会遇到多线程间操作共享集合的问题,很多时候大家都很难逃避这个问题做到一种无锁编程状态,你也知道一旦给共享集合套上lock之后,并发和伸缩能力往往会造成很大影响,这篇就来谈谈如何尽可能 ...

  7. api_DZFPKJ & api_DZFPCX

    AES加密算法的网站:http://www.ssleye.com/aes_cipher.html """ AES加密(加解密算法/工作模式/填充方式:AES/ECB/PK ...

  8. Java读源码之CountDownLatch

    前言 相信大家都挺熟悉 CountDownLatch 的,顾名思义就是一个栅栏,其主要作用是多线程环境下,让多个线程在栅栏门口等待,所有线程到齐后,栅栏打开程序继续执行. 案例 用一个最简单的案例引出 ...

  9. Java 排序算法-冒泡排序及其优化

    Java 排序算法-冒泡排序及其优化 什么是冒泡排序 基本写法 优化后写法 终极版本 源码及测试 什么是冒泡排序 这里引用一下百度百科上的定义: 冒泡排序(Bubble Sort),是一种计算机科学领 ...

  10. cocos2d 导演,场景

    导演(Director) Cocos2d-x 使用导演的概念,这个导演和电影制作过程中的导演一样!导演控制电影制作流程,指导团队完成各项任务.在使用 Cocos2d-x 开发游戏的过程中,你可以认为自 ...