Return to Linux Life Edit

  ホーム · 全てのクラス · 主要なクラス · 注釈付きクラス一覧 · グループ別クラス · 関数一覧

[前へ: The Scribe Classes] [ホーム] [次へ: 新しい Qt Designer]

Qt4メインウインドウクラス

Qt 3 のメインウィンドウクラスは置き換えられ、 Qt 4 では新しいウィンドウクラスが導入される. 利用の簡便さはそのままに、より効率的な実装が可能となる.

Qt4メインウインドウクラスの概要

顧客および社内の開発者から寄せられた多数の要求を満たすべく、メインウィンドウに関連するクラスは再設計された. その目的としては、メインウィンドウの管理における堅実かつ効率的なフレームワークを提供することにある.

ツールバーとドックウィンドウの機能は、独立した2つのクラス QToolBar QDockWidgetによっておこなわれる. ツールバーとドックウィジェットは別々の領域に属し、ツールバーはドックウィジェット領域の外部に配置される. これは、 QToolBar QDockWidgetを継承し、それぞれのコンポーネントが同じエリアを共有する Qt 3 での標準的な動作とは異なっている. 結果として、ユーザにとってはより一貫性のある、経験的に予測可能なものとなった. ツールバーとドックウィジェットは新しい位置にドラッグして移動させることができる.

上に示したダイアグラムでは、ツールバーとドックウィジェットを含んだメインウィンドウのレイアウトを示している. 角の部分は隣接するドックウィジェット領域としてつかうことができ、ドックウィジェットのふるまいとメインウィンドウのレイアウトを指定どおりにすることができる.

ツールバーとドックウィジェットはメインウィンドウの子ウィジェットである. メインウィンドウによってドック領域のウィジェットへ親がすげ替えられることはもうない. 代わりにレイアウトがツールバーとドックウィジェットの配置を管理するようになった. 結果として、 QDockArea クラスは Qt 4 では不必要となった

メインウィンドウクラスの現状

Qt 4 は、メインウィンドウおよび関連するユーザインターフェースコンポーネントの管理のために以下のクラスを提供する:

Qt 4 Beta 1 から何が変わったのか?

コード例

QMainWindow の利用は簡単である. 一般的には QMainWindow をサブクラス化し、 QMainWindow のコンストラクタ内でメニュー、ツールバー、およびドックウィジェットを設定する.

メニューバーをメインウィンドウに追加するには、単純にメニューを生成し、それをメインウィンドウのメニューバーに追加することでおこなう. QMainWindow::menuBar() 関数は、最初に呼び出された時にメニューバーを自動的に生成することに留意されたい. メインウィンドウでカスタムメニューバーを使うために QMainWindow::setMenuBar() を呼び出すこともできる.

    MainWindow::MainWindow(QWidget *parent)
        : QMainWindow(parent)
    {
        ...
        newAct = new QAction(tr("&New"), this);
        newAct->setShortcut(tr("Ctrl+N"));
        newAct->setStatusTip(tr("Create a new file"));
        connect(newAct, SIGNAL(triggered()), this, SLOT(newFile()));
        openAct = new QAction(tr("&Open..."), this);
        openAct->setShortcut(tr("Ctrl+O"));
        openAct->setStatusTip(tr("Open an existing file"));
        connect(openAct, SIGNAL(triggered()), this, SLOT(open()));
        ...

アクションの生成が終われば、それらをメインウィンドウのコンポーネントとして追加できる. 手始めにポップアップメニューを追加してみよう:

        fileMenu = menuBar()->addMenu(tr("&File"));
        fileMenu->addAction(newAct);
        fileMenu->addAction(openAct);
        ...
        fileMenu->addSeparator();
        ...
    }

QToolBar QMenu クラスは、一貫性のある API を提供するため Qt のアクションシステムを利用している. 上のコードでは、既存のアクションが QMenu::addAction() 関数によっていくつかファイルメニューに追加された. QToolBar にもこの関数が用意されており、メインウィンドウの異なる場所でアクションを容易に再使用できるようになっている. これにより不必要な重複を避けることができる.

メインウィンドウの子としてツールバーを生成し、そこに指定したアクションを追加する:

        fileToolBar = addToolBar(tr("File"));
        fileToolBar->addAction(newAct);
        fileToolBar->addAction(openAct);
        ...
        fileToolbar->setAllowedAreas(Qt::TopToolBarArea | Qt::BottomToolBarArea);
        fileToolbar->setArea(Qt::TopToolBarArea);

この例では、ツールバーはメインウィンドウにおけるトップとボトムのツールバー領域に限定されており、初期にはトップのツールバー領域に配置される. newAct openAct により指定されたアクションは、ツールバーとファイルメニューの双方に表示されることを確認できる.

QDockWidget QToolBarとよく似た方法で利用できる. ドックウィジェットをメインウィンドウの子として生成し、ウィジェットをドックウィジェットの子として追加してみよう:

        contentsWindow = new QDockWidget(tr("Table of Contents"), this);
        contentsWindow->setAllowedAreas(Qt::LeftDockWidgetArea
                                      | Qt::RightDockWidgetArea);
        addDockWidget(Qt::LeftDockWidgetArea, contentsWindow);
        headingList = new QListWidget(contentsWindow);
        contentsWindow->setWidget(headingList);

この例では、ドックウィジェットは左右のドック領域にのみ配置することができ、初期には左のドック領域に配置される.

QMainWindow API は、ドックウィジェット領域の4つの角をどちらのドックウィジェットエリアが占有するかをプログラマにカスタマイズさせることができる. 必要であれば、 QMainWindow::setCorner() 関数によってデフォルトを変更することができる:

    setCorner(Qt::TopLeftCorner, Qt::LeftDockWidgetArea);
    setCorner(Qt::BottomLeftCorner, Qt::LeftDockWidgetArea);
    setCorner(Qt::TopRightCorner, Qt::RightDockWidgetArea);
    setCorner(Qt::BottomRightCorner, Qt::RightDockWidgetArea);

以下のダイアグラムは上記のコードによる設定を示したものである. このレイアウトでは、左右のドックウィジェットがメインウィンドウのトップとボトムの角を占有していることがわかる.

メインウィンドウの全コンポーネントが全て設定し終わったなら、中央のウィジェットを生成し、以下のようなコードでインストールをおこなう:

    QWidget *centralWidget = new QWidget(this);
    setCentralWidget(centralWidget);

中央のウィジェットは QWidgetサブクラスならば何でも構わない.

Qt 3 から何が変わったのか?

Qt 3 の QMainWindow はツールバー、ドックウィジェット、および他の標準的なユーザインターフェースコンポーネントのサポートを提供していたが、そのデザインとしては、数多くの QMainWindow メンバ関数によって管理されるようになっていた. Qt 4 では、 QMainWindow は管理タスクの多くを QDockWidget QToolBarに委譲している. この結果、Qt 4 ではこれらのクラスは全く違う使われ方をしている.

QMainWindow には menuBar() 関数が依然残っているが、メニューは常に QAction オブジェクトを使って構築される. 全てのメニューの種類は、包括的な QMenu クラスを使って構築される.

Qt 3:

    QPopupMenu *fileMenu = new QPopupMenu(this);
    openAction->addTo(fileMenu);
    saveAction->addTo(fileMenu);
    ...
    menuBar()->insertItem(tr("&File"), fileMenu);

Qt 4:

    QMenu *fileMenu = menuBar()->addMenu(tr("&File"));
    fileMenu->addAction(openAction);
    fileMenu->addAction(saveAction);
    ...

ツールバーの生成はメニューの生成方法と同様に、新しくより一貫性があるようになっている.

Qt 3:

    QToolBar *fileTools = new QToolBar(this, "file toolbar");
    openAction->addTo(fileTools);
    saveAction->addTo(fileTools);
    ...

Qt 4:

    QToolBar *fileTools = addToolBar(tr("File Tool Bar"));
    fileTools->addAction(openAction);
    fileTools->addAction(saveAction);
    ...

ドックウィジェットの振る舞いは、 QDockWidgetのメンバ関数を通じて設定されるようになった. 例として、メインウィンドウの左サイドにあるドック領域にドックウィジェットを生成するための新旧の方法を比較してみる.

In Qt 3:

    QDockWidget *dockWidget = new QDockWidget(this);
    mainWin->moveDockWidget(dockWidget, Qt::DockLeft);

In Qt 4:

    QDockWidget *dockWidget = new QDockWidget(mainWindow);
    mainWindow->addDockWidget(Qt::LeftDockWidgetArea, dockWidget);

Qt の API を見栄えよくしただけではない. これらの変更によって、より一貫性のある定義と実装が可能となった. 顧客からのフィードバックによって、これらのクラスをさらに改良していきたい.

[前へ: Scribeクラス] [ホーム] [次へ: 新しい Qt Designer]


Copyright © 2005 Trolltech Trademarks
Qt 4.0.0