トップ > はじめの一歩 > QWidgetでサブクラス化

QWidgetでサブクラス化

ここでは、ユーザーがアプリケーションを終了させるとき、確認のポップアップダイアログを表示して、本当に終了するか確認を行うようにします。
QWidgetのサブクラスとして、Notepadクラスを実装します。

このソースコードはQtのインストールディレクトリ以下の次の場所にあります。
Examples/Qt-5.5/widgets/tutorials/gettingStarted/gsQt/part3

プロジェクトファイルをQtCreatorで開いて実行すると、次のウィンドウが表示されます。



実装を見てみます。

cpp
class Notepad : public QWidget
{
    Q_OBJECT

public:
    Notepad();

private slots:
    void quit();

private:
    QTextEdit *textEdit;
    QPushButton *quitButton;

};

クラス宣言の後にQ_OBJECTマクロを記述して、QOjectであることを宣言します。(クラスはQObjectを継承している必要があります。この場合、QWidgetがQObjectを継承しています。)
QObjectは通常のC++クラスにいくつかの拡張機能をもたらします。
例えば、ランタイムにおいて、クラス名とスロット名の問い合わせを行えたり、スロットの引数の型の問い合わせや、スロットの呼び出しを行えたりします。

9行目でquit()をスロットとして宣言しています。
slotsマクロを使うことで関数をスロットとして認識させ、シグナルに接続できるようになります。

メモ帳に終了ボタンを付けるではmain関数でGUIの構築とシグナルとスロットの接続を行っていましたが、ここではNotepadクラスのコンストラクタで行います。

cpp
Notepad::Notepad()
{
    textEdit = new QTextEdit;
    quitButton = new QPushButton(tr("Quit"));

    connect(quitButton, SIGNAL(clicked()), this, SLOT(quit()));

    QVBoxLayout *layout = new QVBoxLayout;
    layout->addWidget(textEdit);
    layout->addWidget(quitButton);

    setLayout(layout);

    setWindowTitle(tr("Notepad"));
}

クラス宣言にあるようにQTextEditとQPushButtonはポインタで宣言しています。
Qtのルールとして、これらのQObjectは常にヒープに確保すること、そしてそれらのコピーをしてはいけません。

4行目ではtr()で表示される文字列を取得しています。
tr()は多言語に対応したアプリケーションで必要ですが、ここでは深くは見ていきません。

cpp
void Notepad::quit()
{
    QMessageBox messageBox;
    messageBox.setWindowTitle(tr("Notepad"));
    messageBox.setText(tr("Do you really want to quit?"));
    messageBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
    messageBox.setDefaultButton(QMessageBox::No);
    if (messageBox.exec() == QMessageBox::Yes)
        qApp->quit();
}

quitスロットの実装では、QMessageBoxを使って本当にアプリケーションを終了するか尋ねるダイアログの処理を行っています。



前へ 次へ