Qt 将新窗口正确放置在屏幕上,将鼠标居中,移入屏幕

2023-11-21

经过几个月的尝试、搜索、审查代码等,我无法找到在 QT 中正确定位新窗口的解决方案。在我最基本的情况下,我只想获取窗口的最终大小并将其置于鼠标下方居中。它将被移动以确保窗口的任何部分都不在屏幕之外。我不希望窗口出现然后移动到位,这会产生视觉冲击,尤其是在打开桌面 FX 的情况下。

我遇到的问题,并非所有问题都有适当的解决方案:

  1. 在窗口显示之前,frameGeometry 并不总是被填充。

  2. 有时,frameGeometry 是完全错误的,特别是在 Windows 7 上。

  3. 在显示之前,不可能知道是否会应用 sizeHint 或 size,或者介于两者之间的其他内容。也就是说,规模政策似乎不可预测。

请注意,我知道如何保存/恢复先前创建的窗口的几何形状。尽管 QT 这里也有缺陷,但我有一个可行的解决方案。

另请注意,我无法使用窗口管理器的默认位置。对于多显示器设置上的非 MDI 应用程序,它们的位置很糟糕(通常甚至不与鼠标位于同一显示器上)。

我还想避免仅仅为了实现解决方案而对所有小部件和对话框进行子类化,因为它不是通用的。如果这是唯一可能的方法,那么我愿意考虑它(如果事件过滤器也不是一个选项)。

有人有好的可行的解决方案吗?


Edited为了看起来更科学:我已将任意数量的调用更改为processEvents使用一个检查返回值的循环。

再次编辑:看来新版本并不安全:它可能会陷入循环。所以我对迭代次数设置了限制。

原来的:
告诉我怎么回事儿。如果允许我引用我自己的代码:

// BIG PAIN: We want to get the dialog box to caluclate its own size. But there is
// no simple way to do this. The following seems to work, but only if processEvents
// is called at least twice. God knows why:
setAttribute (Qt::WA_DontShowOnScreen, true) ; // Prevent screen flicker
show() ;

QEventLoop EventLoop (this) ;
for (int i = 0 ; i < 10 ; i++)
  if (!EventLoop.processEvents()) break ;

hide() ;
setAttribute (Qt::WA_DontShowOnScreen, false) ;

int x = 99 ; // whatever
int y = 99 ; // whatever

// Make sure it fits on the screen
QRect ScreenRect = qApp -> desktop() -> availableGeometry (ApplicationData -> mainWindow) ;

if (x + frameGeometry().width() > ScreenRect.right())
  x = ScreenRect.right() - frameGeometry().width() ;
if (x < ScreenRect.x()) x = ScreenRect.x() ;

if (y + frameGeometry().height() > ScreenRect.bottom())
  y = ScreenRect.bottom() - frameGeometry().height() ;
if (y < ScreenRect.y()) y = ScreenRect.y() ;

move (x, y) ;

尝试这个,通过不同数量的调用processEvents。 (在这些调用中,各种子小部件和子子小部件递归地调整自身大小。)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt 将新窗口正确放置在屏幕上,将鼠标居中,移入屏幕 的相关文章

随机推荐

  • 左侧带有箭头的微调器

    我正在开发一个 RTL 语言的应用程序 想要更改 Spinner 左侧箭头的位置 有没有办法在不创建自定义微调器的情况下执行此操作 您必须编写一个自定义微调器 示例代码如下 您可以根据需要进行编辑
  • 在 Swift 中获取两个日期(月/日/小时/分钟/秒)之间的差异

    我试图将当前日期之间的差异作为NSDate 和来自 PHP 的日期time 调用例如 NSDate timeIntervalSinceReferenceDate 1417147270 我如何获取两个日期之间的时间差 我想要一个比较两个日期的
  • 找到正值的零交叉和负值的零交叉

    我有一个信号 我想在以下情况下复制 1 从过零开始变为正值 2 复制一定数量的点 例如8000 3 复制完 8000 个点后 继续追加点 直到找到向下的过零部分 我可以找到零交叉点 但我在知道如何判断零交叉点何时变为正值和 或零交叉点变为负
  • 无法再打开 Spyder IDE 进行 Python 编程

    几个月前 我在我的 Windows 7 笔记本电脑上安装了 Python 3 4 作为 Anaconda 的一部分 https www continuum io downloads 我的安装包括 Spyder IDE 并且我已成功使用 Sp
  • ES6 中是否有对 ES5 `module.exports = require('./inner.js')` 的一行类比?

    before module exports require inner js nowadays export default from inner js 我正在尝试这样做 但是 babel 只允许在 es7 stage 1 中这样做目前的建
  • 自定义属性 - 是还是不是?

    最近 我阅读了越来越多关于人们在 HTML 标签中使用自定义属性的文章 主要是为了嵌入一些额外的数据以在 javascript 代码中使用 我希望收集一些反馈 了解使用自定义属性是否是一个好的做法 以及一些替代方案 看起来确实可以简化bot
  • MSBuild IIS 问题

    我正在使用 MSBuild 打包和发布我的 Asp Net MVC 3 Net 4 应用程序 我已经为 MVC 1 0 Net 3 5 应用程序成功完成了此操作 每当我包含 IIS 设置 IncludeIisSettings true 在我
  • ASP.NET MVC 视图模型最佳实践

    我的 ASP NET MVC 站点连接到 WCF 服务以获取数据 WCF 服务返回如下数据协定 DataContract public class Person DataMember public string First get set
  • 对特定 URL 强制使用 HTTPS

    这应该很快 这是我当前的 htaccess 文件 BEGIN WordPress
  • 在 vi/vim 中替换并保留某些“单词”

    例如 如果我有 asd word 123 我想把它替换为 this gt line word 123 保留 word 123 我怎么能这么做呢 通过使用这个 s asd this gt line g 我无法保留中间的措辞 请赐教 使用正则表
  • Perl:数组引用与匿名数组

    这可能是一个愚蠢的问题 以下代码输出的内容 arrayref and arraycont分别 请注意它们之间的区别以及它们的值分配方式 我知道匿名数组的作用 但有人能解释为什么有区别吗 非常感谢 arrayref array qw 1 2
  • 无法在 Ubuntu 14.04 上安装 python pip

    这是我用来安装 python pip 的命令 sudo apt get install python pip 我收到以下错误 Reading package lists Done Building dependency tree Readi
  • RDF 容器和集合之间的区别?

    我读过一本书 容器和集合之间的区别在于 容器始终是打开的 即 可以通过附加的 RDF 语句添加新成员 而集合可以是关闭的 我不太清楚这个区别 它表示不能将新成员添加到集合中 如果我改变最后一个的值怎么办rdf rest财产来自rdf nil
  • Django:是否有任何工具/技巧可用于调试 AJAX 响应?

    通常 当我从 ajax 调用中收到 500 Internal Server Error 时 我看不到响应的详细信息 因为您不想向用户显示它们 在服务器端 我只看到一行 GET xxx yyy HTTP 1 1 500 1150336 在不修
  • 从多个表中选择多个列

    我是 MySQL 的初学者 我很难弄清楚如何解决这个问题 我有两个表 每个表都有很多条目 假设这些是表 Table 1 Table 2 dt1 dt2 dt3 dt4 dt5 1 abc 3 wsx 123 7 asd 3 qax 456
  • 如何动态卸载 JavaScript 文件?

    我包含使用 Ajax 的页面 但我还需要包含它们各自的 javascript 文件 这需要同时从内存中删除以前的 javascript 文件 如何卸载当前加载的 JavaScript 文件 以及内存中的代码 以便加载新页面的文件 它们很可能
  • NGINX 反向代理因链接 Docker 容器而失败

    我有以下内容docker compose yml node1 build node links redis ports 8080 node2 build node links redis ports 8080 service1 build
  • 头文件中的`static`、`extern`、`const`

    a h extern int x1 static int x2 int x3 static const int x4 class A public static const int x5 10 a h将被多个包含 cpp文件 我的问题是 1
  • 使用正则表达式从数字范围中排除某些数字

    有人可以帮助我使用正则表达式吗 我们可以从一系列数字中排除介于两者之间的某些数字 目前 1 9 0 0 9 是配置的正则表达式 现在 如果我想排除几个数字 一个数字 501 504 那么正则表达式看起来会是什么样子 更详细地描述在这个答案中
  • Qt 将新窗口正确放置在屏幕上,将鼠标居中,移入屏幕

    经过几个月的尝试 搜索 审查代码等 我无法找到在 QT 中正确定位新窗口的解决方案 在我最基本的情况下 我只想获取窗口的最终大小并将其置于鼠标下方居中 它将被移动以确保窗口的任何部分都不在屏幕之外 我不希望窗口出现然后移动到位 这会产生视觉