3

Windows タイトル バーのない Qt アプリケーションを作成したい (カスタマイズしたものを作成したい)。

ウィンドウを最小化、最大化、閉じるための 3 つのボタンを作成しました。ウィンドウを最大化すると、アプリケーションはタスクバーを考慮せず、最大化されたウィンドウはタスクバーの下にある画面全体を占めることを除いて、すべてが機能します。代わりに、Windows からの通常の最大化コマンドは、アプリケーション ウィンドウを最大化して、タスクバーの下に移動しないようにします。

Qt::CustomizeWindowHintウィンドウのタイトルバーを使用しない場合、表示される最大化動作は正しいです。しかし、このフラグを使用すると、タイトル バーが消え、アプリケーションがウィンドウの下に表示されます。ここでは、動作を説明する 2 つのスクリーンショットを見つけることができます。

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

メイン.cpp

#include <QApplication>
#include "SampleWindow.h"

int main(int argc, char* argv[]) {
  QApplication app(argc, argv);
  SampleWindow mainWindow;
  mainWindow.show();
  return app.exec();
}
4

2 に答える 2

3

この動作はシステムによって異なります。あなたのコードを Windows 7 と Linux Mint KDE でテストしましたが、動作が異なりました。Windows 7 では、タスクバーが非表示になり、ウィンドウがタスクバーの領域を埋めました。KDE では、ウィンドウが正しく最大化される (ウィジェット パネルを回避し、非表示にしない) ことに気付きました。

しかし、互換モードで Windows 10 でコードを実行しようとすると、Windows Vista および古いバージョンとの互換性でのみ Win7 の動作を繰り返すことができました。

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());
于 2016-10-02T14:20:09.187 に答える
1

最大化ボタンがクリックされたときにこのスロットを使用することで解決策を見つけたと思います:

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

もっとテストする必要がありますが、現時点では領域は正しいようです。

于 2016-10-02T14:38:37.317 に答える