Максимизировать окно поддерживая пределы панели задач

Я хочу создать приложение Qt без строки заголовка Windows (я хочу создать настроенное).

Я создал три кнопки для минимизации, максимизации и закрытия окна. Все работает, за исключением того, что, когда я увеличиваю окно, приложение не учитывает панель задач, а развернутое окно занимает весь экран, проходя под панелью задач. Обычная команда максимизации из окон вместо этого максимизирует окно приложения, избегая попадания под панель задач.

Если я не использую Qt::CustomizeWindowHint появляется строка заголовка окна, и максимизируется поведение; но если я использую этот флаг, строка заголовка исчезнет, ​​и приложение перейдет под окно: здесь вы можете найти два скриншота, объясняющих поведение:

С заголовком Windows:
введите описание изображения здесь

Без заголовка Windows:
введите описание изображения здесь

Как вы можете видеть в последнем случае, кнопка «Закрыть» находится внутри панели задач, потому что приложение занимает весь экран.

Как я могу избежать этого поведения без использования строки заголовка Windows? Я хочу воссоздать то же поведение, что и в строке заголовка окна.

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();
}

2

Решение

Это поведение зависит от системы. Я проверил ваш код на Windows 7 и Linux Mint KDE, и поведение было другим. В Windows 7 панель задач скрыта, а окно заполнено областью панели задач. В KDE я заметил, что окно максимизируется правильно (избегает панелей виджетов и не скрывает их).

Однако, когда я пытался запустить код в Windows 10 в режиме совместимости, я смог повторить поведение Win7 только в случае совместимости с Windows Vista и более ранними версиями.

Для Windows 10 я нашел другое решение: вы можете развернуть окно в полноэкранном режиме, если это вам подходит:

mainWindow.showFullScreen();

или же

setWindowState(Qt::WindowFullScreen);

UPD:
В дополнение к вашему решению я нашел другое:

setGeometry(QApplication::desktop()->availableGeometry().x(),
QApplication::desktop()->availableGeometry().y(),
QApplication::desktop()->availableGeometry().width(),
QApplication::desktop()->availableGeometry().height());
2

Другие решения

Я думаю, что я нашел решение, используя этот слот при нажатии кнопки максимизации:

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);
}

Мне нужно проверить это больше, но на данный момент область кажется правильной.

1

По вопросам рекламы [email protected]