Qt WidgetsでQMdiArea::subWindowList()を使いこなす! 〜 子ウィジェットを自由自在に操るテクニック


QMdiArea::subWindowList() メソッドは、QMdiArea ウィジェット内に存在するすべての子ウィジェット (QMdiSubWindow オブジェクト) をリストとして取得します。このメソッドは、QMdiArea ウィジェット内のウィジェットを管理したり、特定のウィジェットにアクセスしたりする際に役立ちます。

メソッドの構文

QList<QMdiSubWindow *> subWindowList(QMdiArea::WindowOrder order = CreationOrder) const;

引数

  • order (オプション): ウィジェットを並べ替える基準を指定します。デフォルトは CreationOrder であり、ウィジェットが作成された順序でリストされます。他のオプションとして、ActivationOrder (最後にアクティブになった順序)、TabOrder (タブ順序)、Reverse (逆順) などがあります。

戻り値

QMdiSubWindow オブジェクトのリストを返します。

QMdiArea *mdiArea = new QMdiArea;
// ... ウィジェットを mdiArea に追加 ...

QList<QMdiSubWindow *> subWindows = mdiArea->subWindowList();

for (QMdiSubWindow *subWindow : subWindows) {
  // 各ウィジェットに対して処理を行う
  // ...
}
  • ウィジェットをリストから削除するには、removeSubWindow() メソッドを使用します。
  • subWindowList() メソッドは、const メソッドであるため、リスト内のオブジェクトを変更することはできません。
  • QMdiSubWindow オブジェクトは、QMdiArea ウィジェット内の個々のウィジェットを表します。


#include <QApplication>
#include <QMainWindow>
#include <QMdiArea>
#include <QTextEdit>

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

  QMainWindow mainWindow;
  QMdiArea *mdiArea = new QMdiArea;
  mainWindow.setCentralWidget(mdiArea);

  // 3 つのテキストエディタウィジェットを作成し、QMdiAreaに追加する
  for (int i = 0; i < 3; ++i) {
    QTextEdit *textEdit = new QTextEdit;
    textEdit->setWindowTitle(QString("Text Editor %1").arg(i + 1));
    mdiArea->addSubWindow(textEdit);
  }

  // subWindowList() メソッドを使用してウィジェットのリストを取得する
  QList<QMdiSubWindow *> subWindows = mdiArea->subWindowList();

  // 各ウィジェットのウィンドウタイトルを出力する
  for (QMdiSubWindow *subWindow : subWindows) {
    qDebug() << subWindow->windowTitle();
  }

  mainWindow.show();
  return app.exec();
}

このコードを実行すると、次の出力がコンソールに表示されます。

Text Editor 1
Text Editor 2
Text Editor 3


以下に、QMdiArea::subWindowList() の代替方法として検討できるいくつかの方法をご紹介します。

子ウィジェットを直接反復処理する

QMdiArea ウィジェットは、QWidget クラスを継承しているため、children() メソッドを使用してすべての子ウィジェットを反復処理することができます。この方法は、QMdiSubWindow オブジェクトのみを取得したい場合や、リスト内のオブジェクトを変更する必要がある場合に役立ちます。

for (QWidget *child : mdiArea->children()) {
  if (child->isInstanceOf<QMdiSubWindow>()) {
    QMdiSubWindow *subWindow = static_cast<QMdiSubWindow *>(child);
    // 各ウィジェットに対して処理を行う
    // ...
  }
}

QObject::childrenOfType() メソッドを使用する

QObject::childrenOfType() メソッドは、特定の型のすべてのオブジェクトを検索するのに役立ちます。この方法は、QMdiSubWindow オブジェクトのみを取得したい場合に便利です。

QList<QMdiSubWindow *> subWindows = mdiArea->childrenOfType<QMdiSubWindow *>();

for (QMdiSubWindow *subWindow : subWindows) {
  // 各ウィジェットに対して処理を行う
  // ...
}

カスタム検索関数を使用する

より複雑な検索条件が必要な場合は、カスタム検索関数を使用することができます。この方法は、特定の条件に一致するウィジェットのみを取得したい場合に役立ちます。

QList<QMdiSubWindow *> findSubWindows(QMdiArea *mdiArea, bool (*predicate)(QMdiSubWindow *)) {
  QList<QMdiSubWindow *> subWindows;

  for (QWidget *child : mdiArea->children()) {
    if (child->isInstanceOf<QMdiSubWindow>()) {
      QMdiSubWindow *subWindow = static_cast<QMdiSubWindow *>(child);
      if (predicate(subWindow)) {
        subWindows.append(subWindow);
      }
    }
  }

  return subWindows;
}

// 例:ウィンドウタイトルが "Text Editor" であるウィジェットのみを取得する
bool isTextEditor(QMdiSubWindow *subWindow) {
  return subWindow->windowTitle() == "Text Editor";
}

QList<QMdiSubWindow *> textEditors = findSubWindows(mdiArea, isTextEditor);

どの方法を使用すべきか

どの方法を使用するかは、状況によって異なります。一般的には、QMdiArea::subWindowList() メソッドが最も簡単で効率的な方法ですが、より複雑な検索条件が必要な場合は、代替方法を使用する方が適切な場合があります。

  • コードの簡潔性: QMdiArea::subWindowList() メソッドは、単純なケースでは簡潔なコードで済みますが、より複雑な検索条件が必要な場合は、代替方法の方がコードが読みやすくなる場合があります。
  • パフォーマンス: QMdiArea::subWindowList() メソッドは、ウィジェットの数が多い場合にパフォーマンスが低下する可能性があります。その場合は、代替方法を使用する方が効率的な場合があります。