You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Qt(C++)移除Windows窗口默认标题栏同时保留原生边框的实现问题

解决方案

方案1:保留Windows原生窗口边框(仅Windows平台有效)

该方案可以完全保留系统默认的原生边框样式,同时移除标题栏,不需要自行绘制边框。

操作步骤

  1. 先在项目的.pro文件中添加Windows系统库链接:
LIBS += user32.lib
  1. 修改launcher.h,添加原生事件处理函数声明:
#pragma once

#include <QtWidgets/QMainWindow>
#include <QMouseEvent>
#include <QPoint>
#include <windows.h>
#include "ui_launcher.h"

class launcher : public QMainWindow {
    Q_OBJECT

public:
    launcher(QWidget* parent = Q_NULLPTR);

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

private:
    Ui::launcherClass ui;
    int mouseClickX = 0;
    int mouseClickY = 0;
};
  1. 修改launcher.cpp,实现原生事件处理逻辑,拦截系统非客户区计算消息,移除标题栏区域、保留边框区域:
#include "launcher.h"

launcher::launcher(QWidget* parent) : QMainWindow(parent) {
    ui.setupUi(this);
    setWindowFlags(Qt::Window | Qt::CustomizeWindowHint | Qt::MSWindowsFixedSizeDialogHint);
}

bool launcher::nativeEvent(const QByteArray& eventType, void* message, long* result) {
    MSG* msg = static_cast<MSG*>(message);
    if (msg->message == WM_NCCALCSIZE) {
        *result = 0;
        return true;
    }
    return QMainWindow::nativeEvent(eventType, message, result);
}

void launcher::mousePressEvent(QMouseEvent* eventVar) {
    mouseClickX = eventVar->x();
    mouseClickY = eventVar->y();
}

void launcher::mouseMoveEvent(QMouseEvent* eventVar) {
    move(eventVar->globalX() - mouseClickX, eventVar->globalY() - mouseClickY);
}

方案2:自定义绘制边框(跨平台通用)

如果需要跨平台使用,或者想要自定义边框的颜色、粗细,可以直接自行绘制边框,不依赖系统原生样式:

操作步骤

  1. 在构造函数中添加开启样式表绘制的属性:
launcher::launcher(QWidget* parent) : QMainWindow(parent) {
    ui.setupUi(this);
    setWindowFlags(Qt::Window | Qt::CustomizeWindowHint | Qt::MSWindowsFixedSizeDialogHint);
    setAttribute(Qt::WA_StyledBackground);
}
  1. 通过样式表自定义边框样式,示例为设置1px灰色边框:
// 可写在构造函数中,也可在Qt设计师界面设置样式表
setStyleSheet("QMainWindow {border: 1px solid #707070; background-color: #ffffff;}");

如果需要更复杂的边框效果,也可重写paintEvent函数自行绘制。

原问题原因说明

之前出现白色细边框是因为Qt::CustomizeWindowHint标志会禁用Windows系统对窗口非客户区(包含标题栏、边框)的默认绘制逻辑,Qt会自动回退绘制一个最简单的白色边框,因此不会显示原生的系统边框样式。

内容的提问来源于stack exchange,提问作者Louis Bernard

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 22:39:01