【Qt】dialog设置无边框之后,模态窗口失效,无法阻止与其他窗口交互

server/2024/9/29 15:59:48/

在Qt中自定义一个dialog
并且在显示这个对话框的时候,想要指定他的位置:

我在这个dialog的构造函数中设置了他为模态窗口

this->setModal(true);

但是由于我的业务需求,我还设置了它为无边框窗口

this->setWindowFlags(Qt::WindowStaysOnTopHint | Qt::FramelessWindowHint );

但是你一旦设置了FramelessWindowHint 就会会导致模态的设置无效。(也就是弹窗出来以后,用户仍然可以与主界面交互)。

解决办法有两个:
1、你可以再加一个参数:Qt::Dialog

    this->setWindowFlags(Qt::WindowStaysOnTopHint | Qt::FramelessWindowHint | Qt::Dialog);

这样就可以阻止用户与主界面交互了。
2、
你在实例化dialog的时候不要给他指定父对象,这样也可以实现模态。

但是这两个都会带来一个弊端:
本来我弹窗出来的时候我会给他指定一个位置,这个位置是靠move实现的

// 弹窗提示
TipsDialog* _tipDialog = new TipsDialog(_self);   //我指定了父对象
_tipDialog->setObjectName("ServerSync_tipDialog");
// 设置弹窗提示内容
QString message = "No server is selected and cannot be added";
_tipDialog->setTipsText(message);
// 设置弹窗位置  这个位置是相对与父对象的
_tipDialog->move((_self->width() - _tipDialog->width()) / 2,  + (_self->height() - _tipDialog->height()) / 2);

我这样可以让弹窗每次都弹到父对象的中间位置。

但是现在,解决了交互问题之后,无论是用方法1(加了Qt::Dialog)还是方法2(不指定父对象)都会导致这里位置设置失效。
他的move位置不会相对父对象,而是相对全局。

解决办法:
既然move设置的位置变成了全局位置,那就拿到父对象的全局位置,加进去计算,让其仍然相对与父对象居中。

// 弹窗提示
TipsDialog* _tipDialog = new TipsDialog(_self);
//_tipDialog->setParent(_self);
_tipDialog->setObjectName("ServerSync_tipDialog");
// 设置弹窗提示内容
QString message = "No server is selected and cannot be added";
_tipDialog->setTipsText(message);
// 设置弹窗位置
QPoint globalPos = _self->mapToGlobal(QPoint(0, 0));// 获取父对象的全局位置
_tipDialog->move(globalPos.x() + (_self->width() - _tipDialog->width()) / 2, globalPos.y() + (_self->height() - _tipDialog->height()) / 2);
_tipDialog->show();

http://www.ppmy.cn/server/106104.html

相关文章

SpringCloud Gateway及 Springboot 服务 跨域配置

SpringCloud Gateway 跨域配置 配置文件 #跨域支持 spring.cloud.gateway.globalcors.cors-configurations.[/**].allowed-headers[0]* spring.cloud.gateway.globalcors.cors-configurations.[/**].allowed-methods[0]* spring.cloud.gateway.globalcors.cors-configuration…

FPGA上板项目(三)——RAM测试

目录 实验内容实验原理实验步骤实验用时序波形HDL 代码仿真综合实现上板测试 实验内容 对 FPGA 内部的 RAM 进行数据读写操作。 实验原理 RAM (Random Access Memory),是可以进行数据交换的存储器,可读可写;而 ROM&…

k8s流程叙述

Kubernetes (K8s) 是一个开源的,用于管理容器化应用的平台,它提供了部署,扩展和管理容器化应用的机制。 以下是一个简单的Kubernetes部署流程的描述: 1、安装和设置Kubernetes集群。 2、创建一个Docker镜像,并把应用…

pdf怎么加水印?5个pdf加水印小妙招,学会就不愁了!(亲测有效)

水印是一种半透明的图案,通常包含徽标或印章,用以标识文档或图像的创作者。除了用于标识,水印还可以有效地保护机密信息。如果您想在pdf文件中添加水印,有两种主要方法:您可以直接将水印嵌入到pdf文件中,或…

vscode自用插件分享

1. Image preview 通过此插件,当鼠标悬浮在图片的链接上时,可以实时预览该图片,除此之外,还可以看到图片的大小和分辨率。 2. Auto Rename Tag 使用该插件,可以在重命名一个 HTML 标签时,自动重命名 HTML 标…

pnpm快速入门

pnpm快速入门 1.使用pnpm启动项目 pnpm是一个优化的包管理器,它通过锁定工作树的方式来减少依赖安装的开销。要在pnpm环境中启动项目,首先你需要确保已经全局安装了pnpm。然后按照以下步骤操作 克隆项目:如果项目还没有下载,使用…

Nginx: 配置项之main段核心参数用法梳理

概述 我们了解下配置文件中的一个全局段,有哪些配置参数,包括后面的 events 字段,有哪些配置参数这里面也有一些核心参数, 对于我们Nginx运行的性能也是有很重要的帮助我们现在首先关注整个 main 段的一个核心参数用法所谓 main 段&#xff…

PHP 全攻略:从环境搭建到实战项目的深度探索

一、引言 PHP(Hypertext Preprocessor)是一种广泛应用于 Web 开发的服务器端脚本语言。它具有简单易学、功能强大、开源免费等特点,被众多开发者和企业所青睐。本文将详细介绍 PHP 的开发环境搭建、基本语法格式、变量与变量作用域、常量与数…