QT4: Как перезапустить приложение? Сбросить настройки?

1.) Я хотел бы перезапустить приложение QT4. Просто обычное выключение и запуск одного и того же приложения.

2.) Почему? Ну, мне нужна опция, чтобы «сбросить» все. Перезапустить приложение кажется самым простым способом сделать это. Проблема в том, что есть МНОГО классов и все такое. У меня нет времени, чтобы вернуть все настройки к стандарту, все текстовые поля, виджеты очистить ... Я знаю, что перезапуск приложения - не лучший способ, как вы думаете, есть ли другой способ?

Благодарю вас


person Revollt    schedule 26.02.2011    source источник


Ответы (6)


Для перезапуска приложения вы можете использовать startDetached после выхода из процесса:

#include <QApplication>
#include <QProcess>

...

// restart the app:
qApp->quit();
QProcess::startDetached(qApp->arguments()[0], qApp->arguments());
person masoud    schedule 30.10.2011
comment
Это решение не работает на устройстве, оно работает только на эмуляторе, но не перезагружается на nokia E7. - person abhishek; 21.04.2012
comment
Я действительно не знаю о различных устройствах, но я проверил это на Windows, и это работает. - person masoud; 25.04.2012

1) Вы можете запустить скрипт, запланировать запуск ОС позже.

2) Напишите отдельный класс, который содержит все настройки вашего приложения. Сброс при необходимости.

person MSKOnline    schedule 26.02.2011

Забавный запрос. Просто зарезервируйте код выхода для «перезагрузки» и сделайте что-то вроде (не проверено):

int main(int argc, char **argv)
{
 QApplication app(argc, argv);
 ...
 int ret = app.exec();
 if (ret == EXIT_RESTART) {
   ::execve(...);
 }
 return ret;
}

Затем вы можете просто вызвать QApplication::exit(EXIT_RESTART) в любом месте, и все будет готово. Или используйте скрипт-оболочку, чтобы сделать то же самое. (Убедитесь, что в обоих случаях вы удовлетворительно обрабатываете аргументы командной строки, если ваше приложение их принимает.)

Более чистым подходом было бы подключение всех вещей, которые необходимо сбросить, к одному и тому же сигналу.

person Mat    schedule 26.02.2011
comment
Вы также можете использовать здесь try-catch вместо кода возврата. Когда вы думаете, что пришло время перезапуститься, сгенерируйте известное исключение. Его преимущество заключается в том, что вы можете перезапустить его даже в условиях сбоя. - person j4x; 04.03.2011
comment
Qt плохо сочетается с исключениями в общем случае. Некоторые виды использования безопасны, но, насколько я знаю, это не рекомендуется. См. безопасность исключений Qt. - person Mat; 04.03.2011

вы можете удалить классы и создать новые в main() в том же QApplication

person yolo    schedule 26.02.2011

Разумнее всего в таком случае поместить все, что создает/инициализирует виджеты и т. д., в одну функцию (конечно, она может вызывать подфункции). Когда вам нужно сбросить все, просто позвоните. В зависимости от точной реализации вам может потребоваться сначала удалить/отменить инициализацию материала.

person Daggerstab    schedule 26.02.2011

Этот метод работает на PyQt. Я написал это для стирания всех настроек и перезапуска приложения с чистыми настройками. application_main — основной метод, а clearSettings — слот для очистки настроек.

class GuiMain

    #Most of implementation missing

    def clearSettings(self):
        """Deletes all settings, and restarts the application"""
        #TODO: save changes
        setting_store = QSettings()
        setting_store.clear()
        setting_store.sync()
        QApplication.exit(GuiMain.restart_code)

    restart_code = 1000

    @staticmethod
    def application_main():
        """
        The application's main function. 
        Create application and main window and run them.
        """
        while True:
            app = QApplication(sys.argv)
            window = GuiMain()
            window.show()
            ret = app.exec_()
            if ret != GuiMain.restart_code:
                break
            del window
            del app
person Eike    schedule 12.03.2013