Создание объекта QtChart создает ошибку EXC_BAD_ACCESS во время выполнения - PullRequest
0 голосов
/ 27 сентября 2018

В настоящее время я пытаюсь переместить некоторый код из 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) {}

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

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

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

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

1 Ответ

0 голосов
/ 28 сентября 2018

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

Вот цитата из документации Qt:

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

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

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

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

Итак, строка

QApplication app(argc, argv);

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

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

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

...