【Qt Widgets】macOSアプリのタイトルバーとツールバーを自由自在に配置!QMainWindow::unifiedTitleAndToolBarOnMacのすべて


QMainWindow::unifiedTitleAndToolBarOnMac は、macOS アプリケーションのメインウィンドウにおけるタイトルバーとツールバーの配置を制御するためのプロパティです。このプロパティを設定することで、タイトルバーとツールバーを一体化したり、別々に表示したりすることができます。

デフォルトの動作

デフォルトでは、QMainWindow は macOS アプリケーションのタイトルバーとツールバーを別々に表示します。タイトルバーにはアプリケーション名が表示され、ツールバーにはボタンやメニューなどのアクションが表示されます。

unifiedTitleAndToolBarOnMacプロパティの使用

unifiedTitleAndToolBarOnMac プロパティを true に設定すると、タイトルバーとツールバーが一体化されます。これにより、タイトルバーとツールバーの間のスペースがなくなくなり、よりすっきりとした外観になります。

QMainWindow window;
window.setUnifiedTitleAndToolBarOnMac(true);

unifiedTitleAndToolBarOnMac プロパティを false に設定すると、タイトルバーとツールバーが再び別々に表示されます。

QMainWindow window;
window.setUnifiedTitleAndToolBarOnMac(false);
  • unifiedTitleAndToolBarOnMac プロパティを設定すると、タイトルバーの高さに変更が生じる可能性があります。必要に応じて、タイトルバーの高さ調整を行う必要があります。
  • unifiedTitleAndToolBarOnMac プロパティは、macOS アプリケーションでのみ有効です。他のプラットフォームでは、このプロパティを設定しても影響はありません。


#include <QApplication>
#include <QMainWindow>

int main(int argc, char *argv[]) {
  QApplication app(argc, argv);

  QMainWindow window;
  window.setUnifiedTitleAndToolBarOnMac(true);
  window.setWindowTitle("My Application");

  // ツールバーにボタンを追加する
  QToolBar *toolBar = window.addToolBar("Main Toolbar");
  toolBar->addAction(QIcon(":/images/file_open.png"), "Open");
  toolBar->addAction(QIcon(":/images/file_save.png"), "Save");

  // ウィジェットを追加する
  QWidget *widget = new QWidget();
  widget->setLayout(new QVBoxLayout());
  widget->layout()->addWidget(new QLabel("This is a widget"));

  window.setCentralWidget(widget);

  window.show();

  return app.exec();
}

例2:タイトルバーとツールバーを別々に表示する

#include <QApplication>
#include <QMainWindow>

int main(int argc, char *argv[]) {
  QApplication app(argc, argv);

  QMainWindow window;
  window.setUnifiedTitleAndToolBarOnMac(false);
  window.setWindowTitle("My Application");

  // ツールバーにボタンを追加する
  QToolBar *toolBar = window.addToolBar("Main Toolbar");
  toolBar->addAction(QIcon(":/images/file_open.png"), "Open");
  toolBar->addAction(QIcon(":/images/file_save.png"), "Save");

  // ウィジェットを追加する
  QWidget *widget = new QWidget();
  widget->setLayout(new QVBoxLayout());
  widget->layout()->addWidget(new QLabel("This is a widget"));

  window.setCentralWidget(widget);

  window.show();

  return app.exec();
}

説明

上記のコードは、QMainWindow::unifiedTitleAndToolBarOnMac プロパティの使い方を示す例です。

  • 例2 では、unifiedTitleAndToolBarOnMac プロパティを false に設定し、タイトルバーとツールバーを別々に表示しています。
  • 例1 では、unifiedTitleAndToolBarOnMac プロパティを true に設定し、タイトルバーとツールバーを一体化しています。


QMainWindow::unifiedTitleAndToolBarOnMac は、macOS アプリケーションのタイトルバーとツールバーの配置を制御するためのプロパティですが、いくつかの代替方法があります。

QTitleBar と QToolBar を直接使用する

QMainWindow を使用せずに、QTitleBarQToolBar を直接使用することで、タイトルバーとツールバーの配置を制御することができます。

#include <QApplication>
#include <QWidget>
#include <QTitleBar>
#include <QToolBar>

int main(int argc, char *argv[]) {
  QApplication app(argc, argv);

  QWidget window;
  window.setWindowTitle("My Application");

  // タイトルバーを作成する
  QTitleBar *titleBar = new QTitleBar(&window);
  titleBar->setTitle("My Application");

  // ツールバーを作成する
  QToolBar *toolBar = new QToolBar(&window);
  toolBar->addAction(QIcon(":/images/file_open.png"), "Open");
  toolBar->addAction(QIcon(":/images/file_save.png"), "Save");

  // タイトルバーとツールバーをレイアウトする
  QVBoxLayout *layout = new QVBoxLayout(&window);
  layout->addWidget(titleBar);
  layout->addWidget(toolBar);

  // ウィジェットを追加する
  QWidget *widget = new QWidget();
  widget->setLayout(new QVBoxLayout());
  widget->layout()->addWidget(new QLabel("This is a widget"));

  layout->addWidget(widget);

  window.show();

  return app.exec();
}

カスタムウィジェットを使用する

タイトルバーとツールバーを含むカスタムウィジェットを作成することで、より柔軟なレイアウトを実現することができます。

#include <QApplication>
#include <QWidget>
#include <QHBoxLayout>
#include <QLabel>
#include <QToolBar>

class MyTitleBar : public QWidget {
public:
  MyTitleBar(QWidget *parent = nullptr) : QWidget(parent) {
    QHBoxLayout *layout = new QHBoxLayout(this);
    layout->addWidget(new QLabel("My Application"), Qt::AlignLeft);
    layout->addStretch();
  }
};

int main(int argc, char *argv[]) {
  QApplication app(argc, argv);

  QWidget window;
  window.setWindowTitle("My Application");

  // カスタムタイトルバーを作成する
  MyTitleBar *titleBar = new MyTitleBar(&window);

  // ツールバーを作成する
  QToolBar *toolBar = new QToolBar(&window);
  toolBar->addAction(QIcon(":/images/file_open.png"), "Open");
  toolBar->addAction(QIcon(":/images/file_save.png"), "Save");

  // タイトルバーとツールバーをレイアウトする
  QVBoxLayout *layout = new QVBoxLayout(&window);
  layout->addWidget(titleBar);
  layout->addWidget(toolBar);

  // ウィジェットを追加する
  QWidget *widget = new QWidget();
  widget->setLayout(new QVBoxLayout());
  widget->layout()->addWidget(new QLabel("This is a widget"));

  layout->addWidget(widget);

  window.show();

  return app.exec();
}

サードパーティ製のライブラリを使用する

QMainWindow の代替となるサードパーティ製のライブラリを使用することができます。これらのライブラリは、より多くの機能や柔軟性を提供する場合があります。

  • カスタムウィジェットやサードパーティ製のライブラリを使用する場合は、追加の開発労力が必要となります。
  • 上記の方法はすべて、macOS アプリケーションでのみ有効です。他のプラットフォームでは、これらの方法を使用しても影響はありません。