最大化 window 保持任务栏限制
Maximize window maintaining taskbar limits
我想创建一个没有 windows 标题栏的 Qt 应用程序(我想创建一个自定义的应用程序)。
我创建了三个用于最小化、最大化和关闭 window 的按钮。一切正常,除了考虑到当我最大化 window 时,应用程序不考虑任务栏,并且最大化的 window 占据了整个屏幕,位于任务栏下方。来自 windows 的普通最大化命令会最大化应用程序 window 避免进入任务栏下方。
如果我不使用 Qt::CustomizeWindowHint
,则会出现 window 标题栏,并且最大化行为是正确的;但是如果我使用这个标志,标题栏就会消失并且应用程序会在 window 下:在这里你可以找到两个解释行为的截图:
标题为Windows:
没有Windows标题:
如您所见,在后一种情况下,"Close" 按钮位于任务栏内,因为应用程序占据了整个屏幕。
如何在不使用 windows 标题栏的情况下避免这种行为?我想重新创建与 window 标题栏相同的行为。
SampleWindow.h
#ifndef SAMPLEWINDOW_H_
#define SAMPLEWINDOW_H_
#include <QMainWindow>
#include <QPushButton>
#include <QHBoxLayout>
class SampleWindow : public QMainWindow {
Q_OBJECT
public:
SampleWindow();
virtual ~SampleWindow() = default;
};
#endif // !SAMPLEWINDOW_H_
SampleWindow.cpp
#include "SampleWindow.h"
#include <QCoreApplication>
SampleWindow::SampleWindow() :
QMainWindow() {
// With uncommenting this line the title bar disappears
// but application goes under the taskbar when maximized
//
//setWindowFlags(Qt::CustomizeWindowHint);
auto centralWidget = new QWidget(this);
auto layout = new QHBoxLayout(this);
auto minimizeButton = new QPushButton("Minimize", this);
auto maximizeButton = new QPushButton("Maximize", this);
auto closeButton = new QPushButton("Close", this);
layout->addWidget(minimizeButton);
layout->addWidget(maximizeButton);
layout->addWidget(closeButton);
centralWidget->setLayout(layout);
setCentralWidget(centralWidget);
connect(closeButton, &QPushButton::clicked, [=]() {QCoreApplication::quit();});
connect(minimizeButton, &QPushButton::clicked, this, [=]() {setWindowState(Qt::WindowMinimized);});
connect(maximizeButton, &QPushButton::clicked, this, [=]() {setWindowState(Qt::WindowMaximized);});
}
Main.cpp
#include <QApplication>
#include "SampleWindow.h"
int main(int argc, char* argv[]) {
QApplication app(argc, argv);
SampleWindow mainWindow;
mainWindow.show();
return app.exec();
}
此行为取决于系统。我在 Windows 7 和 Linux Mint KDE 上测试了您的代码,行为有所不同。 Windows 7 任务栏已隐藏,window 已填充任务栏区域。在 KDE 中,我注意到 window 最大化正确(避免小部件面板而不是隐藏它们)。
然而,当我尝试 运行 使用兼容模式在 Windows 10 中编写代码时,我只能在与 Windows Vista 和旧版本兼容的情况下重复 Win7 的行为。
对于 Windows 10,我找到了另一个解决方案:如果适合您,您可以全屏最大化 window:
mainWindow.showFullScreen();
或
setWindowState(Qt::WindowFullScreen);
UPD:
除了您的解决方案外,我还找到了另一个解决方案:
setGeometry(QApplication::desktop()->availableGeometry().x(),
QApplication::desktop()->availableGeometry().y(),
QApplication::desktop()->availableGeometry().width(),
QApplication::desktop()->availableGeometry().height());
我想我找到了一个解决方案,就是在单击最大化按钮时使用这个插槽:
void SampleWindow::maximize() {
//setWindowState(Qt::WindowFullScreen);
QDesktopWidget *desktop = QApplication::desktop();
QRect desktopGeometry = desktop->availableGeometry();
int desktopHeight = desktopGeometry.height();
int desktopWidth = desktopGeometry.width();
int padx = (frameGeometry().width() - geometry().width()) / 2;
setFixedSize(desktopWidth, desktopHeight);
move(-padx,0);
}
我需要进行更多测试,但目前该区域似乎是正确的。
我想创建一个没有 windows 标题栏的 Qt 应用程序(我想创建一个自定义的应用程序)。
我创建了三个用于最小化、最大化和关闭 window 的按钮。一切正常,除了考虑到当我最大化 window 时,应用程序不考虑任务栏,并且最大化的 window 占据了整个屏幕,位于任务栏下方。来自 windows 的普通最大化命令会最大化应用程序 window 避免进入任务栏下方。
如果我不使用 Qt::CustomizeWindowHint
,则会出现 window 标题栏,并且最大化行为是正确的;但是如果我使用这个标志,标题栏就会消失并且应用程序会在 window 下:在这里你可以找到两个解释行为的截图:
标题为Windows:
没有Windows标题:
如您所见,在后一种情况下,"Close" 按钮位于任务栏内,因为应用程序占据了整个屏幕。
如何在不使用 windows 标题栏的情况下避免这种行为?我想重新创建与 window 标题栏相同的行为。
SampleWindow.h
#ifndef SAMPLEWINDOW_H_
#define SAMPLEWINDOW_H_
#include <QMainWindow>
#include <QPushButton>
#include <QHBoxLayout>
class SampleWindow : public QMainWindow {
Q_OBJECT
public:
SampleWindow();
virtual ~SampleWindow() = default;
};
#endif // !SAMPLEWINDOW_H_
SampleWindow.cpp
#include "SampleWindow.h"
#include <QCoreApplication>
SampleWindow::SampleWindow() :
QMainWindow() {
// With uncommenting this line the title bar disappears
// but application goes under the taskbar when maximized
//
//setWindowFlags(Qt::CustomizeWindowHint);
auto centralWidget = new QWidget(this);
auto layout = new QHBoxLayout(this);
auto minimizeButton = new QPushButton("Minimize", this);
auto maximizeButton = new QPushButton("Maximize", this);
auto closeButton = new QPushButton("Close", this);
layout->addWidget(minimizeButton);
layout->addWidget(maximizeButton);
layout->addWidget(closeButton);
centralWidget->setLayout(layout);
setCentralWidget(centralWidget);
connect(closeButton, &QPushButton::clicked, [=]() {QCoreApplication::quit();});
connect(minimizeButton, &QPushButton::clicked, this, [=]() {setWindowState(Qt::WindowMinimized);});
connect(maximizeButton, &QPushButton::clicked, this, [=]() {setWindowState(Qt::WindowMaximized);});
}
Main.cpp
#include <QApplication>
#include "SampleWindow.h"
int main(int argc, char* argv[]) {
QApplication app(argc, argv);
SampleWindow mainWindow;
mainWindow.show();
return app.exec();
}
此行为取决于系统。我在 Windows 7 和 Linux Mint KDE 上测试了您的代码,行为有所不同。 Windows 7 任务栏已隐藏,window 已填充任务栏区域。在 KDE 中,我注意到 window 最大化正确(避免小部件面板而不是隐藏它们)。
然而,当我尝试 运行 使用兼容模式在 Windows 10 中编写代码时,我只能在与 Windows Vista 和旧版本兼容的情况下重复 Win7 的行为。
对于 Windows 10,我找到了另一个解决方案:如果适合您,您可以全屏最大化 window:
mainWindow.showFullScreen();
或
setWindowState(Qt::WindowFullScreen);
UPD: 除了您的解决方案外,我还找到了另一个解决方案:
setGeometry(QApplication::desktop()->availableGeometry().x(),
QApplication::desktop()->availableGeometry().y(),
QApplication::desktop()->availableGeometry().width(),
QApplication::desktop()->availableGeometry().height());
我想我找到了一个解决方案,就是在单击最大化按钮时使用这个插槽:
void SampleWindow::maximize() {
//setWindowState(Qt::WindowFullScreen);
QDesktopWidget *desktop = QApplication::desktop();
QRect desktopGeometry = desktop->availableGeometry();
int desktopHeight = desktopGeometry.height();
int desktopWidth = desktopGeometry.width();
int padx = (frameGeometry().width() - geometry().width()) / 2;
setFixedSize(desktopWidth, desktopHeight);
move(-padx,0);
}
我需要进行更多测试,但目前该区域似乎是正确的。