Qt 工作 Windows 8 风格无框自定义窗口

2023-12-15

我最近在我的 Windows 7 机器上安装了适用于 Windows 的 Github,并且喜欢它的自定义框架,它非常适合整个应用程序主题,并且有自己的标题栏按钮,布局非常好,非常流畅,并且工作起来看起来非常自然和。

我做了一些挖掘,发现了 2 个可以完全清除边框的标志,经过一些定制后,我的应用程序也有了一个很好的定制外观,它很直观,但与所有具有旧 Windows 边框的应用程序不同。

问题是它不像其他窗口那样流畅和自然响应,它很糟糕,我很容易让窗口用鼠标移动,但它经常出现故障,并且能够移动到它不喜欢的区域单击并拖动禁用的按钮。

链接到 showMaximize 方法的最大化按钮只是放大了整个窗口以占据整个桌面,您仍然可以移动它(并没有真正最大化)。

该窗口不响应任何系统信号,例如单击任务栏将其最小化等。

经过大量修复后,我最终放弃了,这很遗憾,因为我真的很喜欢它的外观,而且它非常直观,就像 Windows 上的 github 非常直观一样。

有什么办法可以做到这一点,我真的还没准备好放弃。

我知道在制作原始Windows API应用程序时,您必须将其链接到XP内置样式,因为它默认继承Windows 95样式,也许有Qt未连接到的Windows 8样式,我不知道没有研究还没有走那么远。


通过单击任务栏最小化窗口

看起来Qt::FramelessWindowHint的实施是有限的。设置此标志后,Windows 认为该窗口无法最小化或最大化。我试过了这个解决方案在纯 winapi 中实现。通过单击任务栏最小化和恢复无框窗口效果很好。显然 Qt 设置了一些阻止此功能的错误标志。也许有一个很好的理由,我不知道。

我们可以将winapi和Qt一起使用,但是比较麻烦。首先,在设置窗口标志并使用 Qt 显示窗口后,应执行 winapi 代码。否则 Qt 将覆盖窗口标志。

另一个问题是,当我们使用 winapi 删除边框时,窗口几何形状突然发生变化,而 Qt 并不知道这一点。渲染和事件映射(包括鼠标单击位置)变得无效。我没有找到任何更新映射的记录方法。我发现我们可以告诉 Qt 屏幕方向已更改,并强制它重新计算窗口几何形状。但这看起来像是一个肮脏的黑客行为。还有QWidget::windowHandleQt 4 中缺少该功能,并且 Qt 5 中“可能会发生变化”。所以这种方法不可靠。但无论如何,现在可以了。以下是应放置在顶部窗口类构造函数中的完整代码(在 Windows 8 中测试):

#include "windows.h"
#include <QWindow>
//...
show();
HWND hwnd = reinterpret_cast<HWND>(effectiveWinId());
LONG lStyle = GetWindowLong(hwnd, GWL_STYLE);
lStyle &= ~(WS_CAPTION | WS_THICKFRAME | WS_MINIMIZE | WS_MAXIMIZE | WS_SYSMENU);
SetWindowLong(hwnd, GWL_STYLE, lStyle);
setWindowFlags(windowFlags() | Qt::FramelessWindowHint);
windowHandle()->reportContentOrientationChange(Qt::PrimaryOrientation);

解决这个问题的真正方法是修改Window Qt平台插件(参见Qt源码中的QWindowsWindow类)。可能有一种方法可以继承默认实现,修改它并在您的应用程序中使用。您也可以询问 Qt 开发人员这种行为是否合理或者是否是一个错误。我认为这个问题可以通过补丁来解决。

如果您仍然打算使用此代码并且还应该支持其他操作系统,请不要忘记将特定于 Windows 的实现包装在#ifdef Q_OS_WIN.

仅当单击标题栏且窗口未最大化时才启用窗口拖动

其他问题可以更容易地解决。当您处理鼠标事件以实现窗口拖动时,请检查窗口状态和事件位置,并在不需要时禁用移动。

void MainWindow::mousePressEvent(QMouseEvent *e) {
  if (!isMaximized() && 
      e->button() == Qt::LeftButton && 
      ui->title->geometry().contains(e->pos())) {
    window_drag_start_pos = e->pos();
  }
}

void MainWindow::mouseReleaseEvent(QMouseEvent *e) {
  window_drag_start_pos = QPoint(0, 0);
}

void MainWindow::mouseMoveEvent(QMouseEvent *e) {
  if (!window_drag_start_pos.isNull()) {
    move(pos() + e->pos() - window_drag_start_pos);
  }
}

void MainWindow::on_minimize_clicked() {
  showMinimized();
}

void MainWindow::on_maximize_clicked() {
  if (isMaximized()) {
    showNormal();
  } else {
    showMaximized();
  }
}

Here ui->title是用于显示假标题栏的标签,并且QPoint window_drag_start_pos是一个类变量。

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

Qt 工作 Windows 8 风格无框自定义窗口 的相关文章

  • 如何使用“gem install”命令从私有 GitHub 存储库安装 gem

    如何在本地安装托管在 GitHub 上的私人存储库中的 gem 特别是 我们通过gem install命令而不是在 Bundler 中使用 因为它是一个命令行工具 我尝试这样做 gem install githubname repo s h
  • 在 GitHub 上执行拉取请求时避免不需要的合并提交和其他提交

    我在 Github 上分叉了一个项目 令远程上游为upstream我的远程存储库是origin 我当地的master分支设置为跟踪远程master分支 然后我在本地添加了一些东西master 时不时与上游汇合 直到今天我想发出pull re
  • 如何在本地快速拉取拉取请求

    在合并拉取请求之前 我想在本地快速拉取请求并运行测试并测试一些内容 我还不想点击 gihub 合并拉取请求 我以为滑轮会有帮助http ejohn org blog pulley http ejohn org blog pulley 但我收
  • Git 在推送代码时返回错误 403 [重复]

    这个问题在这里已经有答案了 一切都工作正常 直到我创建了一个新的 GitHub 帐户 当我尝试使用新帐户第一次将代码推送到 github 服务器时 出现以下错误 remote Permission to NEW USER NEW REPO
  • 使用 QGraphicsScene 实现流畅的动画

    我希望我的问题并不总是同样的问题 我有一个 QGraphicsScene 它的项目是一些 QGraphicsPixmap 我用一个计时器来移动它们 每秒 SetX 10 我设置 10是因为窗口大100 使用这个解决方案我的动画不流畅 我想我
  • ssh 连接超时

    我无法在 git 中 ssh 到 github bitbucket 或 gitlab 我通常会收到以下错误消息 如何避免它 输出 ssh T email protected cdn cgi l email protection i ssh
  • 如何使用 GitHub API 一次检索多个用户?

    我能够获取单个用户 或自某个时间戳以来创建的所有用户 或者与 GitHub API 进行某些搜索匹配的位置 https developer github com v3 users get a single user https develo
  • 通过引用传递 [C++]、[Qt]

    我写了这样的东西 class Storage public Storage QString key const int value const void add item QString int private QMap
  • Qt 支持 Windows 蓝牙 API 吗?

    谁能告诉我 Qt 是否支持 Windows 蓝牙 API 如果是这样 您能否分享一些有关如何使用它的信息 自上次答复以来 这个问题的答案发生了一些变化 Qt 5 2 版为 Linux BlueZ 和 BlackBerry 设备实现了蓝牙 A
  • 如何签出仅在“git ls-remote”中列出的分支?

    我遇到了无法切换到仅列出的分支的情况git ls remote 这是详细信息 我分叉了一个 github repoA 作为 repoB 创建了自己的分支并将其推送到 ComputerA 中的 repoB 在 ComputerB 中 我将分叉
  • 通过单击内部小部件而不是标题栏来移动窗口

    在 Windows 中 当我创建 QMainWindow 时 我可以通过单击标题栏并拖动它来在屏幕上移动它 在我的应用程序中 我使用隐藏了标题栏setWindowFlags Qt CustomizeWindowHint 我正在尝试使用小部件
  • 从分叉存储库的 GitHub 操作发布评论的解决方法

    我需要在 GitHub 操作完成后向 GitHub 拉取请求发表评论 例如当 FOSS 社区成员提交 PR 时 我知道 当操作从分叉的存储库运行时 令牌没有对父存储库的写访问权限 因此它无法发布评论 人们是否为此找到了任何可行的解决方法 我
  • Github:我的仓库登陆页面上缺少“设置”菜单

    设置 菜单应该是最后一个菜单 位于 图形 菜单之后 没有 设置 菜单会影响我设置 Webhook 的能力 是的 这是我的仓库 我拥有它 landing page of my test repo travis repo 我今天也遇到了同样的问
  • Linux 上的静态 Qt5 构建:部署时如何处理字体?

    我使用这些配置选项创建了 Qt 5 2 0 库的静态版本 Ubuntu 12 04 开源 确认许可 force pkg config 发布 静止的 前缀 home juzzlin qt5 无icu opengl桌面 无油嘴滑舌 辅助功能 n
  • C# 控制台应用程序 - cmd.exe 挂起

    我在 Visual Studio 2013 中运行简单的 C 控制台应用程序时遇到问题 我的问题的详细信息 我成功运行控制台应用程序 默认的 按任意键继续 显示在最后 突然 它开始表现出不同的行为 并出现以下症状 一个新的命令窗口 cmd
  • Qt:更改 Mac OS X 上的应用程序 QMenuBar 内容

    我的应用程序对多个 页面 使用 QTabWidget 其中顶级菜单根据用户所在的页面而变化 我的问题是 尝试重新创建菜单栏的内容会导致严重的显示问题 它在除 Mac OS X 之外的所有平台上按预期使用第一种和第三种样式 尚未测试第二种 但
  • 隐藏 MediaPlayer 控件(Microsoft 媒体平台播放器框架)

    我在 c xaml 应用程序中使用 MMP PF 提供我自己的控制元素来处理播放器 这就是为什么我想隐藏 禁用出现在底部的本机控件 在屏幕截图的屏幕中间 这只是使用了一个主题 有人知道该怎么做吗 我没能找到合适的房产 像这样使用 axWin
  • CMake AUTOMOC,文件位于不同文件夹中

    我有一个简单的 CMake 项目 proj project folder a h a cpp CMakeLists txt CMakeLists txt cmake minimum required VERSION 3 2 set CMAK
  • QML MouseArea 将事件传播到按钮

    我正在开发一个应用程序 其菜单类似于 Android 版 Gmail 收件箱应用程序菜单 基本上 当您按下按钮打开菜单时 它就会滑入视图 用户可以将其滑开或按菜单上的按钮 对于滑动我使用了代码SwipeArea from kovrov ht
  • 是否可以从 Github 网站或 API 获取分支合并列表?

    在我们的工作流程中 不会 直接 提交到主分支 主分支仅接收来自 Pull 请求的合并 我们可以将每次合并视为添加到主分支的新功能 因此 我想获得一个合并到 master 中的列表 作为一种可视化随着时间的推移添加到产品中的功能块的方式 gi

随机推荐

  • 我可以在这个复杂的不规则形状链接上使用CSS悬停吗

    我已经研究了很多可能的解决方案 但仍然没有找到有效的解决方案 我正在尝试使用 CSS 让我的链接在悬停时发光 我尝试使用矩形的每个版本来包围我的图像以链接它们 但有些非常小并且会重叠 有没有办法将多坐标合并到 CSS 中 我认为我的主要问题
  • 将 Web 应用程序发布到 Azure 网站暂存部署槽因 webjob 失败

    我刚刚为我的应用程序创建了一个新的部署槽 将发布配置文件导入到 Visual Studio 但部署后我收到此错误消息 错误 8 创建 WebJob 计划时发生错误 找不到与 WebSiteName myapp staging 和 WebSi
  • 在 Git 中查找更改最多的文件

    如何显示 Git 中最常更改的文件 您可以执行以下操作 git log pretty format name only sort uniq c sort rg head 10 日志仅输出每次提交中已更改的文件的名称 而其余部分仅排序并输出前
  • AbstractTableModel getValueAt 性能

    我是新手JTable 也许我不明白什么 假设我有ArrayList共 1000 个Students id name surname age 我想向所有学生展示JTable 据我所知 我必须创造StudentTableModel that e
  • “类型*名称”和类型*名称”有什么区别?[重复]

    这个问题在这里已经有答案了 我是 C 新手 我找不到任何地方将 放在类型后面或名称前面有什么区别 例如 两者之间的区别是什么 int p int p C 编译器忽略空格 字符常量和字符串文字内的空格除外 代表着 int p int p in
  • Excel VBA 更新:查找数据、循环多个工作表、复制范围

    昨天更新此线程 Excel VBA 查找数据 循环多个工作表 复制特定单元格范围 特别感谢 findwindow 让我走到这一步 我在某个部分不断收到运行时 91 错误 并最终放入 If Then 语句以跳到下一张表 但现在我在其正下方的行
  • 用python将假分数转换为带分数

    我需要使用 python 将假分数转换为带分数 甚至将浮点数转换为带分数 我的代码如下 from fractions import Fraction numerator int input Enter numerator denominat
  • 在 MagicalRecord 中使用现有的 SQLite 数据库

    我创建了一个 SQLite 数据库 其中包含一些 JSON 的记录 使用本教程 我想使用 MagicalRecord 来查询它 MagicalRecord 看到 NSManagedObject BlogPost 并且可以创建记录 但它看不到
  • Nginx 由于不允许的 MIME 类型(“text/html”)而被阻止。角8

    everythink 与这些代码配合得很好 http include mime types default type application octet stream log format main remote addr remote u
  • 如何展平多维数组?

    在 PHP 中 是否可以在不使用递归或引用的情况下展平 双 多 维数组 我只对值感兴趣 因此可以忽略键 我在想array map and array values 可以在以下位置找到更新的解决方案下面这个答案 As of PHP 5 3最短
  • 递归导致的分段错误

    我正在编写一个程序 该程序将获取 1 10 之间的数字并显示排列数字的所有可能方式 前任 输入 3 输出 1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1 每当我输入 9 或 10 时 程序就会给出分段错误并转储核心
  • 为什么浏览器将 tbody 元素插入到 table 元素中?

    我正在使用原始 html 和 JQuery 尝试一些想法 我所做的一件事是创建一个包含一组行的表格元素 table tr td Title td tr tr td 1 td tr tr td 2 td tr tr td 3 td tr tr
  • 解析 XML 内容 - C#

    我使用 XML 的时间不长 需要从 XML 响应中提取有用的信息 如果有 2 个相同但名称不同的标签 例如
  • SUMIF 仅过滤数据

    我有一个 Excel 公式 可以对特定数据列进行求和 SUMIF Data E E E 89 Data F F 我正在寻找添加一个我想要过滤的 G 列 因此 理想情况下 当我单击 数据 gt 筛选 时 我可以使 SUMIF 仅对 G 列中筛
  • 有关 using 语句的一些高级问题

    我知道这里有很多关于如何使用 using 语句和调用 Dispose 方法的线程 我已经阅读了其中的大部分主题 如果我调用 Dispose 它会调用 Close 吗 如果我想使用一个对象 比如 SqlDataReader 但随后在另一个代码
  • 使用 XPath 访问 XML 中的注释

    如何使用 XPath 访问 XML 文档中的注释 例如 table table
  • 如何将mysql表的行转置为列

    这是我当前的 mysql 表的样子 PunchID EmpID PunchEvent PunchDateTime 1 0456 clockin 5 14 2013 8 36 26 AM 48 0456 breakout 5 14 2013
  • 分散 Flask 模型时,引发 RuntimeError: 'application not Registered on db'

    我正在通过分散模型 蓝图来重构我的 Flask 应用程序 但遇到运行时错误 def create app app flask Flask app app config SQLALCHEMY DATABASE URI sqlite app r
  • 优化 Internet Explorer 11 的滚动速度

    我目前有一个类似议程的应用程序 其中第一列绝对水平 第一行绝对垂直 我通过捕获滚动效果并更改其附加的 CSS 类的 left 或 top 属性来实现此目的 这些课程最多可达 700 个项目 每天 2 年 window scroll func
  • Qt 工作 Windows 8 风格无框自定义窗口

    我最近在我的 Windows 7 机器上安装了适用于 Windows 的 Github 并且喜欢它的自定义框架 它非常适合整个应用程序主题 并且有自己的标题栏按钮 布局非常好 非常流畅 并且工作起来看起来非常自然和 我做了一些挖掘 发现了