Qt Widgetsでドラッグ&ドロップ可能なウィジェットを作成!QDockWidget::featuresプロパティの応用例


QDockWidget::featuresは、QDockWidgetウィジェットの機能を制御するためのプロパティです。このプロパティを使用して、ウィジェットのドッキング動作、フロート動作、タイトルバーの表示などを設定できます。

設定可能な機能

QDockWidget::featuresプロパティを使用して設定できる機能は以下の通りです。

  • AutoHide (自動非表示)
    ウィジェットが非アクティブになったときに自動的に非表示にするかどうかを制御します。
  • TitleBar (タイトルバー)
    ウィジェットにタイトルバーを表示するかどうかを制御します。
  • Movable (移動可能)
    ウィジェットをドッキングエリア内で移動できるかどうかを制御します。
  • Closable (閉じる)
    ウィジェットを閉じるボタンで閉じることができるかどうかを制御します。
  • Floatable (フロート可能)
    ウィジェットを独立したウィンドウとしてフロートさせることができるかどうかを制御します。
  • Dockable (ドッキング可能)
    ウィジェットをドッキングエリアにドッキングできるかどうかを制御します。

設定方法

QDockWidget::featuresプロパティを設定するには、以下のコードを使用します。

widget->setFeatures(QDockWidget::Dockable | QDockWidget::Floatable | QDockWidget::Closable);

上記コードは、ウィジェットをドッキング可能、フロート可能、閉じ可能に設定します。

以下のコードは、ウィジェットをドッキングエリアの左側にドッキングし、タイトルバーを表示し、自動非表示を有効にする例です。

widget->setFeatures(QDockWidget::Dockable | QDockWidget::TitleBar | QDockWidget::AutoHide);
widget->setAllowedAreas(Qt::LeftDockWidgetArea);

QDockWidget::featuresプロパティは、ビットマスクを使用して設定できます。各機能に対応するビットマスク定数は、QDockWidgetクラスで定義されています。



#include <QtWidgets/QApplication>
#include <QtWidgets/QMainWindow>
#include <QtWidgets/QDockWidget>

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

  QMainWindow window;

  QWidget *widget = new QWidget;
  widget->setWindowTitle("ドッキング/フロートウィジェット");

  QDockWidget *dockWidget = new QDockWidget("ドッキング/フロートウィジェット", &window);
  dockWidget->setWidget(widget);
  dockWidget->setFeatures(QDockWidget::Dockable | QDockWidget::Floatable);
  dockWidget->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea | Qt::TopDockWidgetArea | Qt::BottomDockWidgetArea);

  window.addDockWidget(dockWidget);
  window.show();

  return app.exec();
}

例2:タイトルバーと自動非表示

この例では、ウィジェットにタイトルバーを表示し、非アクティブになったときに自動的に非表示するようにします。

#include <QtWidgets/QApplication>
#include <QtWidgets/QMainWindow>
#include <QtWidgets/QDockWidget>

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

  QMainWindow window;

  QWidget *widget = new QWidget;
  widget->setWindowTitle("タイトルバー/自動非表示ウィジェット");

  QDockWidget *dockWidget = new QDockWidget("タイトルバー/自動非表示ウィジェット", &window);
  dockWidget->setWidget(widget);
  dockWidget->setFeatures(QDockWidget::Dockable | QDockWidget::TitleBar | QDockWidget::AutoHide);
  dockWidget->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea | Qt::TopDockWidgetArea | Qt::BottomDockWidgetArea);

  window.addDockWidget(dockWidget);
  window.show();

  return app.exec();
}

例3:ドッキングエリアの制限

この例では、ウィジェットを左側のドッキングエリアにのみドッキングできるようにします。

#include <QtWidgets/QApplication>
#include <QtWidgets/QMainWindow>
#include <QtWidgets/QDockWidget>

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

  QMainWindow window;

  QWidget *widget = new QWidget;
  widget->setWindowTitle("ドッキングエリア制限ウィジェット");

  QDockWidget *dockWidget = new QDockWidget("ドッキングエリア制限ウィジェット", &window);
  dockWidget->setWidget(widget);
  dockWidget->setFeatures(QDockWidget::Dockable | QDockWidget::TitleBar);
  dockWidget->setAllowedAreas(Qt::LeftDockWidgetArea);

  window.addDockWidget(dockWidget);
  window.show();

  return app.exec();
}


QDockWidget::featuresプロパティは、ウィジェットの機能を制御するための便利なプロパティですが、状況によっては代替方法の方が適切な場合があります。

代替方法

QDockWidget::featuresプロパティの代替方法として、以下の方法が考えられます。

  • スタイルシートを使用する
    QDockWidgetクラスは、スタイルシートを使用して外観をカスタマイズすることができます。例えば、タイトルバーを非表示にするには、以下のスタイルシートを使用します。
  • 個別のプロパティを使用する
    QDockWidgetクラスには、featuresプロパティで設定できる機能ごとに個別のプロパティが用意されています。例えば、dockable属性を設定するにはsetDockable()メソッド、floatable属性を設定するにはsetFloatable()メソッドを使用します。
QDockWidget::titleBar {
  visibility: hidden;
}
  • シグナル/スロットを使用する
    QDockWidgetクラスは、dockable属性が変更されたときにemitされるdockableChanged()シグナルなど、様々なシグナルをemitします。これらのシグナルをスロットに接続することで、機能を制御することができます。

以下のコードは、QDockWidget::featuresプロパティの代わりに個別のプロパティを使用する例です。

widget->setDockable(true);
widget->setFloatable(true);
widget->setClosable(true);

以下のコードは、QDockWidget::featuresプロパティの代わりにスタイルシートを使用する例です。

widget->setStyleSheet("QDockWidget::titleBar { visibility: hidden; }");

以下のコードは、QDockWidget::featuresプロパティの代わりにシグナル/スロットを使用する例です。

void onDockableChanged(bool dockable) {
  if (!dockable) {
    // ウィジェットを非表示にする
  }
}

widget->connect(widget, &QDockWidget::dockableChanged, this, &onDockableChanged);

状況に応じた選択

QDockWidget::featuresプロパティは、シンプルでわかりやすい方法でウィジェットの機能を設定できますが、状況によっては個別のプロパティ、スタイルシート、シグナル/スロットの方が柔軟性が高く、より詳細な制御が可能になります。