В настоящее время я пытаюсь переместить некоторый код из 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)
Заранее спасибо, если кто-нибудь сможет разобраться в этом