Qt Windows 去掉标题栏后 最大化窗口时任务栏被窗口遮住问题

这篇具有很好参考价值的文章主要介绍了Qt Windows 去掉标题栏后 最大化窗口时任务栏被窗口遮住问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在写Qt窗口时,假如对窗口设置了 Qt::FramelessWindowHint 或者 Qt::CustomizeWindowHint 标志,会发现窗口在副屏上最大化会遮住任务栏。

假如自己实现最大化来解决这个问题,虽然能够解决,但窗口状态就需要自己维护
// 最大化窗口 将窗口大小设置为屏幕可用区域大小
this->setGeometry(QApplication::desktop()->availableGeometry());
在Windows中通过拦截窗口消息的方式可以更优雅的解决这个问题

在窗口类中重写 nativeEvent 函数来处理窗口消息:WM_GETMINMAXINFO
来自微软官方文档解释:

WM_GETMINMAXINFO
当窗口的大小或位置即将更改时,发送到窗口。 应用程序可以使用此消息替代窗口的默认最大化大小和位置,或者默认的最小或最大跟踪大小。
[https://learn.microsoft.com/zh-cn/windows/win32/winmsg/wm-getminmaxinfo?redirectedfrom=MSDN]

当窗口接收到最大化消息时会往窗口发送WM_GETMINMAXINFO消息,假如不处理此消息,窗口大小默认就是屏幕大小,那么我们可以拦截此消息去设置窗口大小

bool MainWindow::nativeEvent(const QByteArray &eventType, void *message, long *result)
{
#ifdef Q_OS_WIN
    MSG* msg = (MSG*)message;

    if (msg->message == WM_GETMINMAXINFO) {
        const auto flags = this->windowFlags();
        if (((flags & Qt::FramelessWindowHint) == Qt::FramelessWindowHint) || ((flags & Qt::CustomizeWindowHint) == Qt::CustomizeWindowHint)) {
            MINMAXINFO* mmi = (MINMAXINFO*)(msg->lParam);
            // 窗口所在屏幕的可用区域(去除任务栏的可用区域)
            const auto availableGeometry = QApplication::desktop()->availableGeometry(this->window());

            // 设置最大化的窗口大小
            mmi->ptMaxSize.y = availableGeometry.height();
            mmi->ptMaxSize.x = availableGeometry.width();

            return true;
        }
    }
#endif // Q_OS_WIN
    return MainWindow::parent_type::nativeEvent(eventType, message, result);
}

下面附上窗口类的完整示例:

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    using parent_type = QMainWindow;

    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

protected:
    bool nativeEvent(const QByteArray &eventType, void *message, long *result) override;

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

mainwindow.cpp文章来源地址https://www.toymoban.com/news/detail-754507.html

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QApplication>
#include <QDesktopWidget>

#ifdef Q_OS_WIN
#include <Windows.h>
#endif // Q_OS_WIN

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    this->setWindowFlags(Qt::CustomizeWindowHint);

    // 最大化按钮
    connect(ui->pushButton, &QPushButton::clicked, this, [this]() {
        if (this->isMaximized()) this->showNormal();
        else this->showMaximized();
    });
}

MainWindow::~MainWindow()
{
    delete ui;
}

bool MainWindow::nativeEvent(const QByteArray &eventType, void *message, long *result)
{
#ifdef Q_OS_WIN
    MSG* msg = (MSG*)message;

    if(msg->message == WM_GETMINMAXINFO) {
        const auto flags = this->windowFlags();
        if(((flags & Qt::FramelessWindowHint) == Qt::FramelessWindowHint) || ((flags & Qt::CustomizeWindowHint) == Qt::CustomizeWindowHint)) {
            MINMAXINFO* mmi = (MINMAXINFO*)(msg->lParam);
            const auto availableGeometry = QApplication::desktop()->availableGeometry(this->window());

            mmi->ptMaxSize.y = availableGeometry.height();
            mmi->ptMaxSize.x = availableGeometry.width();

            return true;
        }
    }
#endif // Q_OS_WIN
    return MainWindow::parent_type::nativeEvent(eventType, message, result);
}

到了这里,关于Qt Windows 去掉标题栏后 最大化窗口时任务栏被窗口遮住问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python中最全的窗口操作,如窗口最大化、最小化、窗口置顶、获取缩放比例等

    本文记录在Python中操作 Windows 应用窗口的操作。 这里的操作都是自己摸索+借助强大的搜索引擎整理出来的,我真棒!!! 名称 解释名称 ctypes Python 的外部函数库。它提供了与 C 兼容的数据类型,并允许调用 DLL 或共享库中的函数。 pywin32 是Win32(PYWIN32)扩展的 Python 的ream

    2024年01月16日
    浏览(37)
  • 【深度学习】什么是互信息最大化?

      在学习无监督学习时,最常用的loss就是最大化互信息。所以本文对互信息最大化做了一个总结。内容和图片多有参考其他资料,相关的文献一并在参考文献列出。(如果使用对比学习含有温度系数的那个损失函数可能会更简单一点) [1]什么是「互信息」? [2]DIM:通过最

    2024年02月13日
    浏览(49)
  • 如何使音频类app广告变现收益最大化

    要使音频类应用程序的广告变现收益最大化,可以采取以下策略: admaoyan猫眼聚合 精准定位受众: 了解你的用户群体,包括他们的兴趣、偏好和行为,以便向他们展示相关性更高的广告。使用用户数据分析工具,如Google Analytics或Firebase Analytics,以获取深入的洞察。 多样化

    2024年02月20日
    浏览(53)
  • MySQL | 深入了解如何最大化利用 MySQL 函数(一)

    前言 ✨欢迎来到小K的MySQL专栏,本节将为大家带来MySQL字符串函数和数学函数的讲解 ✨ 一、字符串函数 函数 作用 UPPER(列|字符串) 将字符串每个字符转为大写 LOWER(列|字符串) 将字符串每个字符转为小写 CONCAT(str1,str2,…) 将所有字符串连接成一个字符串 REPLACE(列|字符串,新字符

    2024年02月08日
    浏览(49)
  • 期望最大化(EM)算法:从理论到实战全解析

    本文深入探讨了期望最大化(EM)算法的原理、数学基础和应用。通过详尽的定义和具体例子,文章阐释了EM算法在高斯混合模型(GMM)中的应用,并通过Python和PyTorch代码实现进行了实战演示。 关注TechLead,分享AI全维度知识。作者拥有10+年互联网服务架构、AI产品研发经验、

    2024年02月08日
    浏览(48)
  • 【元宇宙】区块链,元宇宙最大化的驱动力

    如今,一些观察者认为区块链是在结构上实现元宇宙的必要条件,而其他人则认为这种说法是荒谬的。人们对于区块链技术本身仍然有很多困惑,所以根本谈不上清楚地了解込块链技术与元宇宙的关系。所以,我们可以从区块链的定义开始介绍。 简侧言之,区块链是由一个去

    2024年02月10日
    浏览(52)
  • Gvim显示行号、最大化、字号、主题等常用配置修改

    Gvim的设置分两种:1. 临时设置,2. 永久设置 ,本文只关注永久设置的情况。 配置Gvim只需修改Gvim配置文件即可, Linux中,配置文件的地址是~/.vimrc ,若没有该文件则创建即可,我们可以直接输入 gvim ~/.vimrc 来进行配置,windows中的配置文件地址在vim的安装地址下,文件名叫做

    2024年02月15日
    浏览(57)
  • 力扣 1005. K 次取反后最大化的数组和

    题目来源:https://leetcode.cn/problems/maximize-sum-of-array-after-k-negations/description/ C++题解1:最直接的想法就是负的变正的,如果负的元素数量小于k,就挑选绝对值大的负数变正;如果负的元素数量大于k,那么还需要根据剩下的k(待变换数)的奇偶性来判断,偶数就不用管了,奇数

    2024年02月16日
    浏览(38)
  • K 次取反后最大化的数组和【贪心算法】

    1005 . K 次取反后最大化的数组和 给你一个整数数组 nums 和一个整数 k ,按以下方法修改该数组: 选择某个下标 i 并将 nums[i] 替换为 -nums[i] 。 重复这个过程恰好 k 次。可以多次选择同一个下标 i 。 以这种方式修改数组后,返回数组 可能的最大和 。 关于 nums = IntStream.of(nums

    2024年02月11日
    浏览(45)
  • 【数学建模】面包店老板使日均收入最大化的诀窍

    1 问题描述 面包店每天烘烤一定数量的面包出售,每个成本3元,以8元的价格卖出,晚间关门前将未卖完的面包无偿处理掉,若已知每天面包需求量的概率分布如下表所示。从长期看,面包店老板为了能得到最高的日均收入,他每天要烘烤多少个面包?这个最高日均收入是多

    2024年02月04日
    浏览(62)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包