Я хочу создать приложение Qt без строки заголовка Windows (я хочу создать настроенное).
Я создал три кнопки для минимизации, максимизации и закрытия окна. Все работает, за исключением того, что, когда я увеличиваю окно, приложение не учитывает панель задач, а развернутое окно занимает весь экран, проходя под панелью задач. Обычная команда максимизации из окон вместо этого максимизирует окно приложения, избегая попадания под панель задач.
Если я не использую Qt::CustomizeWindowHint
появляется строка заголовка окна, и максимизируется поведение; но если я использую этот флаг, строка заголовка исчезнет, и приложение перейдет под окно: здесь вы можете найти два скриншота, объясняющих поведение:
Как вы можете видеть в последнем случае, кнопка «Закрыть» находится внутри панели задач, потому что приложение занимает весь экран.
Как я могу избежать этого поведения без использования строки заголовка 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();
}
Это поведение зависит от системы. Я проверил ваш код на 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());
Я думаю, что я нашел решение, используя этот слот при нажатии кнопки максимизации:
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);
}
Мне нужно проверить это больше, но на данный момент область кажется правильной.