0

出于实践原因,我目前正在尝试将一些代码从 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)

如果有人能理解这一点,请提前感谢

4

1 回答 1

0

您没有任何 QApplication 实例。

这是来自 Qt Docs 的引用:

QApplication 类管理 GUI 应用程序的控制流和主要设置。

QApplication 包含主事件循环,来自窗口系统和其他源的所有事件都在其中处理和调度。它还处理应用程序的初始化、终结,并提供会话管理。此外,QApplication 处理大部分系统范围和应用程序范围的设置。

对于任何使用 Qt 的 GUI 应用程序,只有一个 QApplication 对象,无论应用程序在任何给定时间是否有 0、1、2 或更多窗口。对于非 GUI Qt 应用程序,请改用 QCoreApplication,因为它不依赖于 QtGui 库。

可以通过 instance() 函数访问 QApplication 对象,该函数返回与全局 qApp 指针等效的指针。

所以,线

QApplication app(argc, argv);

创建 QApplication 类的实例。

最后,您需要调用app.exec()which 进入主事件循环并等待直到调用 exit(),然后返回设置为 exit() 的值(如果通过 quit() 调用 exit(),则返回 0)。

需要调用此函数来启动事件处理。主事件循环从窗口系统接收事件并将这些事件分派给应用程序小部件。

于 2018-09-28T04:15:24.240 回答