トップ 一覧 ソース 検索 ヘルプ RSS ログイン

QDialogを閉じるときの処理の流れメモ

ESCキーが押されたときと、クローズボタンが押されたときで、共通の処理を入れるにはどうすればいいのか? という話題。

 ESCキーが押されたときの処理

1.QDialog::keyPressEvent()

void QDialog::keyPressEvent(QKeyEvent *e)
{
        case Qt::Key_Escape:
            reject();
            break;

2.QDialog::reject()

void QDialog::reject()
{
    done(Rejected);
}

3.QDialog::done()

void QDialog::done(int r)
{
    Q_D(QDialog);
    hide();
    setResult(r);

    d->close_helper(QWidgetPrivate::CloseNoEvent);
    d->resetModalitySetByOpen();

    emit finished(r);
    if (r == Accepted)
        emit accepted();
    else if (r == Rejected)
        emit rejected();
}

 クローズボタンが押されたとき

1.QWidget::event()

bool QWidget::event(QEvent *event)
{
    case QEvent::Close:
        closeEvent((QCloseEvent *)event);
        break;

2.QDialog::closeEvent()

void QDialog::closeEvent(QCloseEvent *e)
{
#ifndef QT_NO_WHATSTHIS
    if (isModal() && QWhatsThis::inWhatsThisMode())
        QWhatsThis::leaveWhatsThisMode();
#endif
    if (isVisible()) {
        QPointer<QObject> that = this;
        reject();
        if (that && isVisible())
            e->ignore();
    } else {
        e->accept();
    }
}

3.QDialog::reject()

以下、『ESCキーが押されたときの処理』と同じ流れ。

 まとめ

close()をプログラムから呼び出した場合、『クローズボタンが押されたとき』の処理になる。つまり、ダイアログが非表示の状態でclose()を呼び出すとaccept()になるのか・・・ って、これは本題と関係ないなw

とにかく、ダイアログの終了で何かやりたかったら、QDialog::done()を継承するのが手っ取り早そう。外のクラスからやりたかったら、finished()をどこかと接続しておく、と。


(2009/11/24 メモ,QT