Qt工作Windows 8样式的无框自定义窗口

黑雪

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

我做了一些挖掘,发现2个标志可以完全清除边框,并且在进行了一些自定义之后,我的应用程序也具有很好的自定义外观,这很直观,但与所有带有旧Windows边框的应用程序不同。

事实是,它不像其他窗口那样流畅,自然响应,令人毛骨悚然,我很容易使窗口随鼠标移动,但它经常出现毛刺,并且能够在不应该移动的区域移动单击并拖动禁用的按钮。

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

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

经过大量修复之后,我终于放弃了这是羞愧的原因,因为我真的很喜欢它的外观,而且非常直观,就像Windows的github非常直观。

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

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

帕维尔·斯特拉霍夫(Pavel Strakhov)

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

看来,Qt::FramelessWindowHint的实现是有限的。设置此标志时,Windows认为无法最小化或最大化此窗口。我已经尝试过在纯winapi中实现的此解决方案通过单击任务栏最小化和还原无框架窗口,效果很好。显然,Qt设置了一些阻止该功能的错误标志。我不知道这可能是有充分的理由的。

我们可以同时使用winapi和Qt,但这很麻烦。首先,应在设置窗口标志并使用Qt显示窗口之后执行winapi代码。否则,Qt将覆盖窗口标志。

另一个问题是,当我们使用winapi删除边框时,窗口几何形状突然改变,而Qt对此一无所知。渲染和事件映射(包括鼠标单击位置)无效。我没有发现任何记录的方式来更新映射。我发现我们可以告诉Qt屏幕方向发生了变化,并迫使它重新计算窗口几何形状。但这看起来像是肮脏的骇客。同样,该QWidget::windowHandle功能在Qt 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();
  }
}

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

显示器之间的Qt自定义无框窗口中的绘画问题

来自分类Dev

Qt中子窗口的自定义UI

来自分类Dev

Windows 8是否有任何自定义DWM(桌面窗口管理器)?

来自分类Dev

自定义确认弹出窗口无法正常工作

来自分类Dev

从自定义协议启动QT App-Windows

来自分类Dev

自定义SystemTray Windows Phone 8?

来自分类Dev

如何从C#中打开共享(Windows 8.1样式)窗口

来自分类Dev

OEM Windows启动图标自定义如何工作?

来自分类Dev

Qt Quick 动态自定义布局(就像 IDE 中的工作区)

来自分类Dev

Qt:如何制作像 QTextField 一样对齐的自定义小部件

来自分类Dev

无法使用Qt Assistant从Qt应用程序内部获取自定义帮助文件以进行工作

来自分类Dev

如何在WPF中创建类似Windows 8样式的进度环?

来自分类Dev

Windows 8 / Server 2012样式等待/加载透明GIF / APNG

来自分类Dev

如何在Windows Phone 8上获取WP7样式的ANID?

来自分类Dev

Windows 8 / Server 2012样式等待/加载透明GIF / APNG

来自分类Dev

iOS 8自定义键盘UIScrollview无法正常工作

来自分类Dev

自定义Windows Phone 8.1消息对话框

来自分类Dev

创建自定义Windows 10通知框

来自分类Dev

像自定义类一样构造的指针(内置类型)如何工作?

来自分类Dev

如何创建像@ sys.airport一样工作的Dialogflow自定义实体?

来自分类Dev

自定义tinymce 4.0.5样式选择工具栏菜单

来自分类Dev

Google自定义搜索引擎和Bootstrap3样式问题

来自分类Dev

自定义MS Word 2007中的标题1样式起始编号

来自分类Dev

是否可以自定义Gnome 3或Unity以模拟Gnome 2样式的界面?

来自分类Dev

自定义Qt QMenu

来自分类Dev

自定义/样式提示窗口?

来自分类Dev

如何自定义 Toast 窗口的样式?

来自分类Dev

用于Qt快速QML应用程序的自定义样式页面(如HTML和CSS)

来自分类Dev

所有Qt快速按钮控件状态的自定义样式

Related 相关文章

  1. 1

    显示器之间的Qt自定义无框窗口中的绘画问题

  2. 2

    Qt中子窗口的自定义UI

  3. 3

    Windows 8是否有任何自定义DWM(桌面窗口管理器)?

  4. 4

    自定义确认弹出窗口无法正常工作

  5. 5

    从自定义协议启动QT App-Windows

  6. 6

    自定义SystemTray Windows Phone 8?

  7. 7

    如何从C#中打开共享(Windows 8.1样式)窗口

  8. 8

    OEM Windows启动图标自定义如何工作?

  9. 9

    Qt Quick 动态自定义布局(就像 IDE 中的工作区)

  10. 10

    Qt:如何制作像 QTextField 一样对齐的自定义小部件

  11. 11

    无法使用Qt Assistant从Qt应用程序内部获取自定义帮助文件以进行工作

  12. 12

    如何在WPF中创建类似Windows 8样式的进度环?

  13. 13

    Windows 8 / Server 2012样式等待/加载透明GIF / APNG

  14. 14

    如何在Windows Phone 8上获取WP7样式的ANID?

  15. 15

    Windows 8 / Server 2012样式等待/加载透明GIF / APNG

  16. 16

    iOS 8自定义键盘UIScrollview无法正常工作

  17. 17

    自定义Windows Phone 8.1消息对话框

  18. 18

    创建自定义Windows 10通知框

  19. 19

    像自定义类一样构造的指针(内置类型)如何工作?

  20. 20

    如何创建像@ sys.airport一样工作的Dialogflow自定义实体?

  21. 21

    自定义tinymce 4.0.5样式选择工具栏菜单

  22. 22

    Google自定义搜索引擎和Bootstrap3样式问题

  23. 23

    自定义MS Word 2007中的标题1样式起始编号

  24. 24

    是否可以自定义Gnome 3或Unity以模拟Gnome 2样式的界面?

  25. 25

    自定义Qt QMenu

  26. 26

    自定义/样式提示窗口?

  27. 27

    如何自定义 Toast 窗口的样式?

  28. 28

    用于Qt快速QML应用程序的自定义样式页面(如HTML和CSS)

  29. 29

    所有Qt快速按钮控件状态的自定义样式

热门标签

归档