从 Qt window 中删除标题栏,同时保留默认的 window 边框

Removing titlebar from Qt window while keeping the default window borders

我试图从我的 Qt window(QT 版本 5.12.2 和使用 C++)中删除默认的 Windows 标题栏,同时仍然保留 window 边框。我已经或多或少地使用标志 Qt::CustomizeWindowHint 实现了这一点。但是,这会将 window 边框更改为白线而不是默认边框。

应用 Qt::CustomizeWindowHint 标志后边框的外观示例:

如您所见,这些不是正常的 Windows window 边框。

如何 change/edit 这些边框(即更改它们的颜色)或如何在删除标题栏时保持默认 Windows window 边框?

这是一个最小的可重现示例:

main.cpp:

int main(int argc, char* argv[]) {

    QApplication application(argc, argv);
    launcher mainWindow;

    //debugChecks();
    mainWindow.setWindowFlags(Qt::Window | Qt::CustomizeWindowHint | Qt::MSWindowsFixedSizeDialogHint);
    mainWindow.setWindowTitle("Test");
    mainWindow.show();

    return application.exec();
}

launcher.h

#pragma once

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

class launcher : public QMainWindow {
    Q_OBJECT

public:
    launcher(QWidget* parent = Q_NULLPTR);

private:
    Ui::launcherClass ui;
    void mousePressEvent(QMouseEvent* eventVar);
    void mouseMoveEvent(QMouseEvent* eventVar);
    int mouseClickX = 0;
    int mouseClickY = 0;

};

launcher.cpp

#include "launcher.h"

launcher::launcher(QWidget* parent) : QMainWindow(parent) {
    ui.setupUi(this);
}


void launcher::mousePressEvent(QMouseEvent* eventVar) {

    mouseClickX = eventVar->x();
    mouseClickY = eventVar->y();
}

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

QPalette and QStyle for Border

Palette 可以更改 window 应用程序的样式和颜色。供参考 https://doc.qt.io/archives/qt-5.7/qtwidgets-widgets-styles-example.html

你的描述不是很清楚。不应该将 QMainWindow 用于 logon/in 对话框。话虽如此,我在 Ubuntu 20.04 上创建了一个应用程序(我使用 qmake 时应该可以很好地为您构建)。你可以download the project zip here。当应用程序启动时,它看起来像这样:

点击“金色”后,它看起来像这样:

绿色之后看起来像这样:

点击 Freaky 后看起来像这样:

请注意,FramelessWindowHint 不仅删除了标题栏和系统菜单以及 window 框架,它还删除了您 resize/drag/move window.

很抱歉没有取出 StackOver1.pro.user 文件。直到刚才才想到。您将需要删除它,否则它可能会破坏您的构建。

你可以这样做

self.setWindowTitle("‎") # Python

mainWindow.setWindowTitle(""); # C/C++

但不是传递空字符串,而是传递空字符。这个对我有用:https://emptycharacter.com/