Как завершить графический интерфейс и выполнить консольную функцию (QT)?

Я совершенно новичок в QT, и я хочу подготовить одно окно и получить некоторый ввод от пользователя, а затем с этим вводом запустить одну консоль и показать вывод в консоли. Я пытался написать код после exec, но кажется, что это невозможно:

int main(int argc, char *argv[])
{
    int retmain = 0;
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    cout<<"pos500"<<endl;
    retmain = a.exec();
    cout<<"pos50"<<endl;
//doing something

    return retmain;
}

Не знаю почему, но после a.exec(); Ничего не произошло. Поэтому я искал в Интернете и нашел ниже тему в stackoverflow: функция после отображения окна?

Но я хочу закрыть графическое окно, а затем выполнить свой процесс.


person SpongeBob    schedule 10.05.2019    source источник
comment
Qt не рекомендует запускать какой-либо код после QApplication::exec(), так как он не всегда может вернуться . Кажется, что QDialog - это не то, что вам нужно вместо QMainWindow, и вызовите для этого exec. Вы также можете переопределить событие закрытия главного окна и запустить расчеты оттуда.   -  person dave    schedule 10.05.2019
comment
Если a.exec() не показывает ваш MainWindow w (как вы говорите, ничего не происходит). тогда я не думаю, что вывод консоли - это не ваша проблема!   -  person hyde    schedule 10.05.2019
comment
Что произойдет, если вы замените MainWindow на QWidget, появится ли тогда окно? Распечатывает ли он ваш вывод после закрытия этого окна?   -  person hyde    schedule 10.05.2019


Ответы (1)


Вам нужно вызвать QCoreApplication::exit(), чтобы exec вернул вам управление.

После вызова этой функции приложение выходит из основного цикла обработки событий и возвращается из вызова exec(). Функция exec() возвращает returnCode. Если цикл обработки событий не запущен, эта функция ничего не делает.

Простой пример:

//mainwindow.h
//////////////////////////////////////////////////
#pragma once
#include <QtWidgets/QMainWindow>
#include <QtCore/QCoreApplication>

class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    MainWindow(QWidget *parent = 0);
    void closeEvent(QCloseEvent *event);
    ~MainWindow();
};

//mainwindow.cpp
//////////////////////////////////////////////////
#include "mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
}
void MainWindow::closeEvent(QCloseEvent *event)
{
    QCoreApplication::exit(0);
    QMainWindow::closeEvent(event);
}
MainWindow::~MainWindow(){}

//main.cpp
//////////////////////////////////////////////////
#include "mainwindow.h"
#include <QApplication>

#include <iostream>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    a.exec();
    std::cout << "test" << std::endl;
    return 0;
}
person PeterT    schedule 10.05.2019