出于实践原因,我目前正在尝试将一些代码从 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 折线图。
工具.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();
}
主文件
#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 库的一部分)
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)
如果有人能理解这一点,请提前感谢