консольная программа в main создается объект унаследованный от QObject
программа завершается с кодом -1073741510. и до деструктора дело не доходить. В чем дело? И как вылечить?
пробовал так, все равно завершается не корректно
int main(int argc, char *argv[]) < QCoreApplication a(argc, argv); Object *ob = new Object; int result = a.exec(); //return a.exec(); delete ob; return result; >
но ведь delete должен вызывать деструктор
Форумчанин
Регистрация: 07.08.2011
Сообщений: 576
в общем тут нужно вызывать слот quit(), класса QCoreApplication.
попробую отлавливать события клавиатуры. что бы скажем при нажатии на Esc программа закрывалась
но видимо что то не так делаю.
вот класс в который передаются события
class MyEvent : public QObject < Q_OBJECT public: MyEvent(QObject *ob = 0) : QObject(ob) < >bool event(QEvent *e) < qDebug()type(); return false; > signals: void quit(); >;
вот так я передаю события в main()
int main(int argc, char *argv[]) < QCoreApplication a(argc, argv); MyEvent *my_event = new MyEvent; //QObject::connect(my_event, SIGNAL(quit()), QEvent *event_key = new QEvent(QEvent::KeyPress); QCoreApplication::postEvent(my_event, event_key); int result = a.exec(); return result; >
но при нажатии на клаву qDebug() ни чего не выводит.
Как запустить .exe вне QT Creator (DLL Collector, windeployqt)
Может я вообще ахинею напилил? Честно говоря с событиями мало дела имел. Помогите разобратся
Последний раз редактировалось SAMOUCHKA; 09.01.2017 в 02:34 .
Источник: www.programmersforum.ru
Как закончить программу Qt из любого места?
На месте комментариев я попытался сделать: qApp-> exit () и qApp-> quit () и this-> close () (но «this» не показано и, конечно, close () не работает). Как я могу закончить приложение из любого места кода?
Весь код:
main.cpp
#include «mainwindow.h»#include int main(int argc, char *argv[])
#ifndef MAINWINDOW_H #define MAINWINDOW_H #include #include «CadrForm.h»#include «TeacherForm.h»#include «DepartmentForm.h»#include «CategoriesForm.h»#include «PostForm.h»#include «RanksAndDegreesForm.h»#include «TeachersRankAndDegreeForm.h»#include «ConnectionForm.h» namespace Ui < class MainWindow; >class MainWindow : public QMainWindow < Q_OBJECT public: explicit MainWindow(QWidget *parent = 0); void start(); ~MainWindow(); signals: void widgetChanged(QWidget*); private slots: void on_actionCadr_triggered(); void resetMainLayout(QWidget* w); void on_actionTeacher_triggered(); void on_actionDepartment_triggered(); void on_actionPost_triggered(); void on_actionCategories_triggered(); void on_actionRanksAndDegrees_triggered(); void on_actionTeachersRD_triggered(); private: ConnectionForm cf; CadrForm *cadrForm; TeacherForm *teacherForm; DepartmentForm *departmentForm; CategoriesForm *categoriesForm; PostForm *postForm; RanksAndDegreesForm *ranksAndDegreesForm; TeachersRankAndDegreeForm *teachersRankAndDegreeForm; QWidget *current; Ui::MainWindow *ui; void addWidgetToMainLayout(QWidget *w); >; #endif // MAINWINDOW_H
#include «mainwindow.h»#include «ui_mainwindow.h»#include MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) < connect(this, SIGNAL(widgetChanged(QWidget*)), this, SLOT(resetMainLayout(QWidget*))); ui->setupUi(this); cadrForm = new CadrForm(this); teacherForm = new TeacherForm(this); departmentForm = new DepartmentForm(this); categoriesForm = new CategoriesForm(this); postForm = new PostForm(this); ranksAndDegreesForm = new RanksAndDegreesForm(this); teachersRankAndDegreeForm = new TeachersRankAndDegreeForm(this); addWidgetToMainLayout(cadrForm); addWidgetToMainLayout(teacherForm); addWidgetToMainLayout(departmentForm); addWidgetToMainLayout(categoriesForm); addWidgetToMainLayout(postForm); addWidgetToMainLayout(ranksAndDegreesForm); addWidgetToMainLayout(teachersRankAndDegreeForm); > void MainWindow::start() < if (cf.exec())< this->show(); > else < qDebug()quit(); qDebug() > void MainWindow::addWidgetToMainLayout(QWidget *w) < ui->mainLayout->insertWidget(0, w); ui->mainLayout->itemAt(0)->widget()->hide(); > MainWindow::~MainWindow() < delete ui; >void MainWindow::resetMainLayout(QWidget *w) < int index; if (current) < index = ui->mainLayout->indexOf(current); ui->mainLayout->itemAt(index)->widget()->hide(); > index = ui->mainLayout->indexOf(w); if (index != -1) ui->mainLayout->itemAt(index)->widget()->show(); else < addWidgetToMainLayout(w); resetMainLayout(w); >current = w; setWindowTitle(current->windowTitle()); > void MainWindow::on_actionCadr_triggered() < emit widgetChanged(cadrForm); >void MainWindow::on_actionTeacher_triggered() < emit widgetChanged(teacherForm); >void MainWindow::on_actionDepartment_triggered() < emit widgetChanged(departmentForm); >void MainWindow::on_actionPost_triggered() < emit widgetChanged(postForm); >void MainWindow::on_actionCategories_triggered() < emit widgetChanged(categoriesForm); >void MainWindow::on_actionRanksAndDegrees_triggered() < emit widgetChanged(ranksAndDegreesForm); >void MainWindow::on_actionTeachersRD_triggered()
А ConnectionForm — это просто QDialog с некоторым GUI и без какого-либо дополнительного кода.
Запуск Qt приложений .exe вне Qt Creator
Решение
Похоже, проблема в том, что вам нельзя звонить QApplication::quit() или же QApplication::exit() пока цикл событий QApplication фактически не начался. Цикл событий запускается QApplication::exec() так ты звонишь quit() / exit() слишком рано, чтобы это дало эффект.
Вы можете исправить это, переместив quit() / exit() вызовите, чтобы он был в цикле событий (например, перемещая MainWindow::start() код для QMainWindow::showEvent() слот), или изменив MainWindow::start() чтобы вернуть значение, проверьте это значение в main и завершите работу (без вызова QApplication :: exec () `), если это значение указывает, что ваш процесс должен завершиться досрочно.
Другие решения
Поскольку вы запускаете цикл событий диалога «рано» — который блокирует — вы не попадаете в цикл событий приложения.
Если это намеренный дизайн, лучше вызвать exit (3) и удалить цикл событий приложения.
Если вы хотите запустить цикл событий приложения, вам нужно убедиться, что он работает до Вы попадаете в точку исполнения вашего диалога.
Быстрое решение состоит в том, чтобы начать один выстрел QTimer прямо перед запуском цикла событий приложения, который вызовет ваш вызов метода «start».
int main(int argc, char *argv[])
и измените начало на слот, соответственно.
В конечном счете, вы можете рассмотреть вопрос о кнопке и т. Д., Чтобы открыть диалог.
Идиоматический способ поставить в очередь вызов метода до тех пор, пока цикл событий не получит шанс на запуск:
QMetaObject::invokeMethod(start», Qt::QueuedConnection);
Таким образом, ваш main станет:
int main(int argc, char *argv[])
Источник: web-answers.ru
Блог
Правильный способ завершить работу с программой Qt?
- Post author: admin
- Запись опубликована: 12 апреля, 2023
- Post category: Вопросы по программированию
#qt #resources #exit #quit
#qt #Ресурсы #выход #ВЫЙТИ
Вопрос:
Как я должен выйти из программы Qt, например, при загрузке файла данных и обнаружении повреждения файла, и пользователю необходимо выйти из этого приложения или повторно запустить файл данных?
- вызов exit(EXIT_FAILURE)
- вызов QApplication::quit()
- вызов QCoreApplication::quit()
И разница между (2) и (3)?
Ответ №1:
QApplication является производным от QCoreApplication и, таким образом, наследует, quit() который является общедоступным слотом QCoreApplication , поэтому между QApplication::quit() и QCoreApplication::quit() нет разницы.
Как мы можем прочитать в документации к QCoreApplication::quit() it , «сообщает приложению завершить работу с кодом возврата 0 (успех)».. Если вы хотите завершить работу из-за обнаружения повреждения файла, возможно, вы не захотите завершать работу с нулевым кодом возврата, что означает успех, поэтому вам следует вызвать QCoreApplication::exit() , потому что вы можете предоставить ненулевой код возврата, который, по соглашению, указывает на ошибку.
Важно отметить, что «если цикл событий не запущен, эта функция (QCoreApplication::exit()) ничего не делает», поэтому в этом случае вам следует вызвать exit(EXIT_FAILURE) .
Ответ №2:
Вы можете вызвать qApp->exit(); . Я всегда использую это, и у меня никогда не было проблем с этим.
Если ваше приложение является приложением командной строки, вы действительно можете захотеть вернуть код выхода. То, что это за код, полностью зависит от вас.
1. Мне нужно было сделать следующее: qApp->exit();
Ответ №3:
Во время поиска по этому самому вопросу я обнаружил этот пример в документации.
QPushButton *quitButton = new QPushButton(«Quit»); connect(quitButton, amp;QPushButton::clicked, amp;app, amp;QCoreApplication::quit, Qt::QueuedConnection);
С соответствующими изменениями для вашего конкретного действия, конечно.
Вместе с этим примечанием.
Рекомендуется всегда подключать сигналы к этому слоту с помощью QueuedConnection. Если сигнал, подключенный (не поставленный в очередь) к этому слоту, передается до того, как управление войдет в основной цикл событий (например, до того, как «int main» вызовет exec()), слот не действует, и приложение никогда не завершается. Использование соединения в очереди гарантирует, что слот не будет вызван до тех пор, пока управление не войдет в основной цикл событий.
Обычно сигнал QGuiApplication::lastWindowClosed() подключается к выходу()
Ответ №4:
Если вы используете Qt Jambi, это должно сработать:
QApplication.closeAllWindows();
Ответ №5:
если вам нужно закрыть свое приложение из main (), вы можете использовать этот код
int main(int argc, char *argv[])< QApplication app(argc, argv); . if(!QSslSocket::supportsSsl()) return app.exit(0); . return app.exec(); >
Программа завершится, если OpenSSL не установлен
1. Я думаю, что это не компилируется. app.exit (0) не возвращает значение int. Используйте if(!QSslSocket::supportsSsl()) ; . Поскольку app.exec () не был вызван в этой строке, app.exit(0) ничего не делает, смотрите документацию QCoreApplication ::exit(): Если цикл событий не запущен, эта функция ничего не делает.
Ответ №6:
//How to Run App bool ok = QProcess::startDetached(«C:TTECCozxyLoggerCozxyLogger.exe»); qDebug() «Run hljs-built_in»>system(«taskkill /im CozxyLogger.exe /f»); qDebug() «Close»;
1. вопрос не в отключении новых процессов
2. Пожалуйста, добавьте к своему ответу какое-нибудь объяснение, чтобы другие могли извлечь из него уроки
Вам также может понравиться
Перемещение DependencyObject между потоками
21 августа, 2022
Реагируйте — повторите отправку после того, как содержимое станет видимым
8 января, 2022
Мне нужно сделать так, чтобы, когда вы поймаете все буквы слова, напишите «Конец» и остановите игру.(Python)
29 ноября, 2022
- О нас
- Онлайн игры
- Конвертеры
- Base64 конвертер онлайн
- Оформление кода JavaScript CSS HTML Онлайн
- URL Encoder (кодировщик) / Decoder (декодировщик) онлайн
- Конвертер регистров
- Рассчитать количество дней между датами
- Генератор ключей и паролей
- Генератор QR кодов
- Преобразование времени
- Преобразование микросекунд в секунды
- Преобразование микросекунд в миллисекунды
- Преобразование миллисекунд в микросекунды
- Преобразование миллисекунд в секунды
- Преобразование миллисекунд в минуты
- Преобразование миллисекунд в часы
- Преобразователь миллисекунд в дату
- Преобразование секунд в миллисекунды
- Преобразование секунд в минуты
- Преобразование секунд в часы
- Преобразование секунд в дни
- Преобразование минут во время
- Преобразование минут в миллисекунды
- Преобразование минут в секунды
- Преобразование минут в часы
- Преобразование часов в миллисекунды
- Преобразование часов в секунды
- Преобразование часов в минуты
- Преобразование часов в дни
- Преобразование дней в часы
- Преобразование из часы в недели
- Конвертация из недели в часы
- Через несколько часов калькулятор
- Преобразование времени AM/PM в 24-часовое
- Преобразование Военного Времени
- Время до десятичного калькулятора
- Безопасность
- Финансы
- Энциклопедия
Источник: programbox.ru