Создание объекта QtChart создает ошибку EXC_BAD_ACCESS во время выполнения

В настоящее время я пытаюсь переместить некоторый код из Python в C++ по практическим соображениям и попытался создать линейную диаграмму с библиотекой QtCharts. Я установил библиотеку Qt с помощью установщика с открытым исходным кодом Qt, предоставленного Qt на их веб-сайте, и, наконец, мне удалось включить библиотеку в проект на Clion со следующим кодом:

CMakelist.txt

cmake_minimum_required(VERSION 3.12)
project(Uebung1)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
# Qt
# Set this to your Qt installation
set(CMAKE_PREFIX_PATH /Users/DaniBook/Qt/5.11.2/clang_64)
set(RESOURCE_FOLDER res)
set(RESOURCE_FILES ${RESOURCE_FOLDER}/resources.qrc)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTORCC ON)

find_package(Qt5Charts CONFIG REQUIRED)

set(PROJECT_SOURCE_DIR src/)
include_directories(${PROJECT_SOURCE_DIR})
add_executable(Uebung1 src/main.cpp src/tools.h src/tools.cpp)
target_link_libraries(Uebung1 Qt5::Charts)

Пока все хорошо, что я смог использовать библиотеку в своем коде, который в основном состоит из двух функций. Тот, который читает данные из файла и преобразует их в вектор целых чисел, и тот, который берет этот вектор и пытается создать линейную диаграмму Qt.

tools.cpp

#include "tools.h"
#include <vector>
#include <string>
#include <map>
#include <iostream>
#include <QtCharts>
#include <fstream>

using namespace std;

void GC_skew(vector<long> &gc_data, string &genome_file) {
    ifstream gfile(genome_file);
    string line;
    long g_sum = 0, c_sum = 0;

    if(gfile.is_open()) {
        //reading file line by line
        while(getline(gfile, line)) {
            //iterating over string characters to count G and C
            for(auto &character : line) {
                switch(character) {
                    case 'G' :
                        g_sum++;
                        break;
                    case 'C' :
                        c_sum++;
                        break;
                    default :
                        continue;
                }
                //appending skew to vector
                gc_data.push_back(g_sum - c_sum);
            }
        }
    }
    else {
        cout << "Unable to open file!" << endl;
    }
}

void skew_chart(vector<long> &gc_data) {
    auto *series = new QLineSeries();//creating new series object
    auto *chart = new QChart();              //creating new chart object
    auto *chartview = new QChartView(chart); //creating chartview object
    QMainWindow window;                     //window object for display
    long pos = 0;

    //iterating over the vector and appending data to series
    for(auto it : gc_data) {
        series->append(pos, it);
        pos++;
    }

    //adding series to chart and viewing chart
    chart->addSeries(series);
    chartview->setRenderHint(QPainter::Antialiasing);
    window.setCentralWidget(chartview);
    window.show();
}

main.cpp

#include <iostream>
#include "tools.h"
#include <vector>
#include <map>

using namespace std;

int main() {
    vector<long> gc_data = {};
    string genome_file = "<path_to_file>";

    GC_skew(gc_data, genome_file);
    skew_chart(gc_data);
}

Код компилируется без ошибки, но при запуске он заканчивается кодом завершения 11 (что бы это ни значило). Однако после отладки я понял, что есть проблема с созданием нового объекта QChart, где я продолжаю получать следующее исключение, как указано отладчиком:

Exception = error: use of undeclared identifier 'Exception' //occurs somewhere before the one below but does not effect the application
Exception = EXC_BAD_ACCESS (code=1, address=0x0) //causes the application to crash

Отладочная информация

Вышеуказанный способ инициализации - это именно тот способ, который Qt ( https://doc.qt.io/qt-5/qtcharts-linechart-example.html) провел для дополнительного исследования их ресурсов. Кто-нибудь из вас знает, что делать?

PS: пошагово перебирая строки, я обнаружил переход при инициализации в заголовок, который, кажется, определяет исключение, которое возникает при любом событии

qtflags.h (часть Qt lib)

Q_DECL_CONSTEXPR inline QFlags(Zero = Q_NULLPTR) Q_DECL_NOTHROW : i(0) {}

однако трассировка стека отладчика указывает на успешное создание объекта.

трассировка стека отладчика

Версия Qt - 5.11.2 Версия компилятора Apple LLVM версия 10.0.0 (clang-1000.11.45.2)

Спасибо заранее, если кто-нибудь может понять это

1 ответ

Решение

У вас нет экземпляра QApplication.

Вот цитата из Qt Docs:

Класс QApplication управляет потоком управления приложения GUI и основными настройками.

QApplication содержит основной цикл событий, где все события из оконной системы и других источников обрабатываются и отправляются. Он также обрабатывает инициализацию, финализацию приложения и обеспечивает управление сеансами. Кроме того, QApplication обрабатывает большинство системных и прикладных настроек.

Для любого приложения с графическим интерфейсом, использующего Qt, существует точно один объект QApplication, независимо от того, имеет ли приложение 0, 1, 2 или более окон в любой момент времени. Для приложений Qt без графического интерфейса используйте QCoreApplication, поскольку это не зависит от библиотеки QtGui.

Объект QApplication доступен через функцию instance(), которая возвращает указатель, эквивалентный глобальному указателю qApp.

Итак, линия

QApplication app(argc, argv);

создает экземпляр класса QApplication.

В конце вам нужно позвонить app.exec() который входит в основной цикл событий и ожидает вызова exit(), а затем возвращает значение, которое было установлено для exit() (что равно 0, если exit() вызывается через quit()).

Необходимо вызвать эту функцию, чтобы начать обработку событий. Основной цикл обработки событий получает события от оконной системы и отправляет их в виджеты приложения.

Другие вопросы по тегам