Максимальное увеличение окна с сохранением ограничений панели задач

Я хочу создать приложение 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();
}

person Jepessen    schedule 02.10.2016    source источник


Ответы (2)


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

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

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

mainWindow.showFullScreen();

or

setWindowState(Qt::WindowFullScreen);

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

setGeometry(QApplication::desktop()->availableGeometry().x(),
            QApplication::desktop()->availableGeometry().y(),
            QApplication::desktop()->availableGeometry().width(),
            QApplication::desktop()->availableGeometry().height());
person J. Craqueador    schedule 02.10.2016
comment
Он разворачивает окно, скрывая панель задач. Хотелось бы развернуть его как обычное настольное приложение .. - person Jepessen; 02.10.2016
comment
@Jepessen, я нашел еще одно решение - person J. Craqueador; 02.10.2016

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

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

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

person Jepessen    schedule 02.10.2016