Окно появляется и сразу исчезает

207
29 января 2018, 06:27

Я хочу вывести График, после нажатой кнопки. Но у меня окошко появляется и сразу исчезает.

ksp_ecology.cpp:

...
    void ksp_ecology::on_pushButton_clicked()
    {
    //![1]
        QLineSeries *series = new QLineSeries();
    //![1]
    //![2]
        series->append(0, 6);
        series->append(2, 4);
        series->append(3, 8);
        series->append(7, 4);
        series->append(10, 5);
        *series << QPointF(11, 1) << QPointF(13, 3) << QPointF(17, 6) << QPointF(18, 3) << QPointF(20, 2);
    //![2]
    //![3]
        QChart *chart = new QChart();
        chart->legend()->hide();
        chart->addSeries(series);
        chart->createDefaultAxes();
        chart->setTitle("Simple line chart example");
    //![3]
    //![4]
        QChartView *chartView = new QChartView(chart);
        chartView->setRenderHint(QPainter::Antialiasing);
    //![4]

    //![5]
        QMainWindow window;
        window.setCentralWidget(chartView);
        window.resize(400, 300);
        window.show();
    //![5]
    }
...
Answer 1

Нельзя создать в функциях на стеке (QMainWindow window;) виджеты, которые после создания будут отображены.

Есть два способа выделять память: на стеке (ваш вариант) и в куче (через оператор new).

В функции вы создаете на стеке виджет и отображаете его, тут же функция завершает работу и ее стек чистится, а вместе со стеком и удаляется виджет.

Решения проблемы:

  • Самое простое. У вас класс, а значит, можно вынести переменную из функции в поля класса.

    ksp_ecology.h:

class ksp_ecology : public QWidget {
    ...
    private:
        QMainWindow window;
    ...
}
  • Создание объекта на куче. Тогда самим нужно будет чистить память за виджетом
//![5]
    QMainWindow* window = new QMainWindow();
    window->setCentralWidget(chartView);
    window->resize(400, 300);
    window->show();
//![5]
  • Остановка выполнения кода функции через цикл обработки событий, который завершится с закрытием виджета. В диалогах это сделано через метод exec. Либо это можно сделать самому используя QEventLoop
READ ALSO
QT, C++, Linux и Vim

QT, C++, Linux и Vim

Недавно решил перейти к изучению С++ и QT (до этого изучал Си) и хотел прояснить несколько вещей для себяПрошу не ругать меня строго, так как...

318
Разбить элементы массива на группы и преобразовать их

Разбить элементы массива на группы и преобразовать их

Помогите, пожалуйста, решить задачу по программированию в с++Разбить элементы массива на группы по 4

235
Множественная перегрузка операторов

Множественная перегрузка операторов

Неправильно сравнивает 2 массива, вместо false(-) выдает true(+)В чем проблема? (Функция помечена комментарием)

215
Натуральный логарифм числа

Натуральный логарифм числа

Какая функция вычисляет натуральный логарифм числа в C++?

214