Предотвратить закрытие приложения QApplication, если служба запущена

У меня есть приложение QML, в котором я создал подкласс QApplication для создания основного экрана с помощью QML. Проблема, с которой я сталкиваюсь, заключается в том, что при нажатии кнопки «Закрыть» приложение закрывается, как и предполагалось, но я хочу обработать ситуацию, когда, если некоторые службы работают, я хочу переопределить поведение кнопки закрытия.

Я безуспешно пытался переопределить closeEvent(). Может ли кто-нибудь указать мне, как я могу справиться с этим?

ОБНОВЛЕНИЕ: это фрагмент кода, который я попробовал.

class SingleApplication : public QApplication {
    Q_OBJECT
public:
    SingleApplication(int &argc, char **argv);

    void closeEvent ( QCloseEvent * event )
    {
        event->ignore();

    }
}

MAIN.cpp

#include "view.h"
#include <QDebug>
#include <QDesktopWidget>
#include "SingleApplication.h"

int main(int argc, char *argv[])
{
    SingleApplication app(argc, argv);
    if(!app.isRunning()) {

        app.processEvents();

        View view(QUrl("qrc:/qml/main.qml"));
#ifdef Q_OS_LINUX
        view.setFlags(Qt::WindowMinimizeButtonHint|Qt::WindowCloseButtonHint);
#endif
        view.setMaximumSize(QSize(1280,700));
        view.setMinimumSize(QSize(1280,700));

        // Centering the App to the middle of the screen
        int width = view.frameGeometry().width();
        int height = view.frameGeometry().height();
        QDesktopWidget wid;
        int screenWidth = wid.screen()->width();
        int screenHeight = wid.screen()->height();
        view.setGeometry((screenWidth/2)-(width/2),(screenHeight/2)-(height/2),width,height);


        view.show();

        return app.exec();
    }
    return 0;

}

person prakashpun    schedule 10.07.2015    source источник
comment
Некоторый соответствующий код может помочь вам получить правильный ответ. Что вы уже пробовали? Что было ошибкой?   -  person folibis    schedule 10.07.2015
comment
Попробуйте использовать QApplication::setQuitOnLastWindowClosed()   -  person t3ft3l--i    schedule 10.07.2015
comment
Вы не вставили код с функцией closingDown(). Опубликуйте краткий, автономный, правильный (компилируемый) пример.   -  person Mitch    schedule 10.07.2015


Ответы (1)


QApplication::closeEvent отсутствует. Такая виртуальная функция принадлежит QWidget.

Использование QApplication показало, что у вас есть обычный контейнер QWidget для вашего пользовательского интерфейса QML (хотя, как вы говорите, пользовательский интерфейс основан на QML). Вам лучше переопределить этот виджет closeEvent, например:

class MyMainWidget : public QWidget // or is it QMainWindow?
{
   // snip
private:
    void closeEvent(QCloseEvent*);
}

void MyMainWidget::closeEvent(QCloseEvent* event)
{
    // decide whether or not the event accepted
    if (condition())
       event->accept();
}

И если ваш виджет-контейнер еще не переопределен (просто QWidget?), что ж, теперь вам нужно это сделать.

И вы не сказали, хотите ли вы, чтобы окно приложения оставалось открытым. Я полагаю, вы тоже этого хотите.

person Alexander V    schedule 10.07.2015
comment
Привет @AlexanderVX, ты хочешь сказать, что мне нужно изменить QApplication на QWidget? Извините, если это глупый вопрос, я понятия не имею об этом! - person prakashpun; 13.07.2015
comment
Можете ли вы предоставить код main.cpp? Это скорее всего покажет. Я имею в виду, что вы, скорее всего, используете QWidget или его дочерний элемент. - person Alexander V; 13.07.2015
comment
Привет @AlexanderVX. Я прикрепил свой код main.cpp. Обратите внимание, что SingleApplication — это класс, который является подклассом QApplication. - person prakashpun; 14.07.2015
comment
Где находится класс View? Он должен быть производным от QWidget и действовать как контейнер для представления QML. Кроме этого, вы не сможете использовать его таким образом. И этот класс должен быть добавлен с обработчиком closeEvent() - person Alexander V; 14.07.2015