2

これは、 QCoreApplication :: quit()のドキュメントからはすぐにはわかりませんでした。

quit()スロットが呼び出されたときに、イベントループ内の保留中のイベントはキャンセルされますか?

4

1 に答える 1

5

呼び出すQCoreApplication::quit()ことは、を呼び出すことと同じQCoreApplication::exit(0)です。そこにそれは言います

この関数が呼び出された後、アプリケーションはメインイベントループを終了し、exec()の呼び出しから戻ります。

イベントループが残っているので、保留中のイベントはキャンセルされると思います。

編集:保留中のイベントが実際にキャンセルされることを示すために、小さなテストケースを作成しました。

#include <QCoreApplication>
#include <QTimer>
#include <QDebug>

class MyObject : public QObject
{
        Q_OBJECT

    public Q_SLOTS:

        void start()
        {
            QCoreApplication::postEvent(this, new QEvent(QEvent::User));
            QCoreApplication::quit();
        }

    protected:

        void customEvent(QEvent* event)
        {
            qDebug() << "Event!";
        }

};

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

    MyObject o;
    QTimer::singleShot(0, &o, SLOT(start()));

    return app.exec();
}

#include "main.moc"

この場合、投稿されたイベントMyObject::start()は到着しません。もちろん、への呼び出しを削除すると、になりQCoreApplication::quit()ます。

于 2011-01-13T08:24:02.153 に答える