从 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/
我试图从我的 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/