diff --git a/main.cmake b/main.cmake index f55c7aa..35258b0 100644 --- a/main.cmake +++ b/main.cmake @@ -1,10 +1,3 @@ -include(${CMAKE_SOURCE_DIR}/third_party/build_infra/Doxygen/export.cmake) -include(${CMAKE_SOURCE_DIR}/third_party/build_infra/Graphviz/export.cmake) -include(${CMAKE_SOURCE_DIR}/third_party/build_infra/LLVM/export.cmake) -include(${CMAKE_SOURCE_DIR}/third_party/build_infra/Cppcheck/export.cmake) -include(${CMAKE_SOURCE_DIR}/third_party/build_infra/lizard/export.cmake) -include(${CMAKE_SOURCE_DIR}/third_party/build_infra/cloc_tokei/export.cmake) -include(${CMAKE_SOURCE_DIR}/third_party/build_infra/CodeMetrics/export.cmake) set(module_dir "${CMAKE_CURRENT_LIST_DIR}/module") set(dir "${module_dir}/radio") file(GLOB_RECURSE srcs "${dir}/*.c" "${dir}/*.cpp" "${dir}/*.h" "${dir}/*.hpp" "${dir}/*.qrc") diff --git a/module/radio/BackEnd/BackEnd_Mock.cpp b/module/radio/BackEnd/BackEnd_Mock.cpp index 478cf76..988ae55 100644 --- a/module/radio/BackEnd/BackEnd_Mock.cpp +++ b/module/radio/BackEnd/BackEnd_Mock.cpp @@ -58,10 +58,9 @@ void push_radio_data(Radio_Widget* rw) { rw->water_fall->give_data(QTime::currentTime(), make_random_data(rw->water_fall->power_range(), rw->water_fall->frequency_point_size(), renderive::Memory_Domain::Waterfall)); } { - int tick = rw->time_power->time_axis()->give_data(QTime::currentTime()); renderive::Range r = rw->time_power->value_axis()->coord_range(); renderive::Range nr = {r.center() - r.length() / 4, r.center() + r.length() / 4}; - rw->time_power->give_data(tick, make_random_value(nr)); + rw->time_power->give_data(QTime::currentTime(), make_random_value(nr)); } { auto r = rw->audio_spectrogram_plot->power_axis()->coord_range(); @@ -84,8 +83,7 @@ void push_radio_data_perf(Radio_Widget* rw) { rw->water_fall->give_data(QTime::currentTime(), make_random_data({0, 160}, 1024, renderive::Memory_Domain::Waterfall)); } { - int tick = rw->time_power->time_axis()->give_data(QTime::currentTime()); - rw->time_power->give_data(tick, make_random_value({-6000, 6000})); + rw->time_power->give_data(QTime::currentTime(), make_random_value({-6000, 6000})); } { rw->audio_spectrogram_plot->give_data(make_random_data({-6000, 6000}, 512, renderive::Memory_Domain::Spectrum)); diff --git a/module/radio/BackEnd/BackEnd_True.cpp b/module/radio/BackEnd/BackEnd_True.cpp index b400645..5557fac 100644 --- a/module/radio/BackEnd/BackEnd_True.cpp +++ b/module/radio/BackEnd/BackEnd_True.cpp @@ -120,8 +120,7 @@ void Back_End::call_back_data_func(int channel, void *pData, int i_length) auto mw = Main_Widget::instance(); auto rw = mw->radio_widget; auto iw = mw->intermediate_frequency_widget; - int tick = rw->water_fall->time_axis()->give_data(QTime::currentTime()); - rw->water_fall->give_data(tick, data); // 中频瀑布图 + rw->water_fall->give_data(QTime::currentTime(), data); // 中频瀑布图 rw->spectrogram_line->give_data(data); // 中频频谱图 iw->afterglow->give_data(data); // 余晖图 @@ -159,8 +158,7 @@ void Back_End::call_back_data_func(int channel, void *pData, int i_length) //std::cout << "audio == " << rbuf[256] << std::endl; - int tick = radio->time_power->time_axis()->give_data(QTime::currentTime()); - radio->time_power->give_data(tick, rbuf[256]); + radio->time_power->give_data(QTime::currentTime(), rbuf[256]); // 保存音频流 diff --git a/module/radio/BackEnd/IntermediateFrequencyWidget.cpp b/module/radio/BackEnd/IntermediateFrequencyWidget.cpp index 182a82a..2f9813c 100644 --- a/module/radio/BackEnd/IntermediateFrequencyWidget.cpp +++ b/module/radio/BackEnd/IntermediateFrequencyWidget.cpp @@ -15,7 +15,7 @@ static renderive::Range frequent_range = {-12000, 12000}; static double max = 160; QWidget* Intermediate_Frequency_Widget::create_spectrogram_power_plot() { - class Spectrum_Plot : public renderive::Plot { + class Spectrum_Plot : public renderive::Latency_Eager_Plot { public: std::shared_ptr x_axis{}; std::shared_ptr y_axis{}; @@ -23,18 +23,21 @@ QWidget* Intermediate_Frequency_Widget::create_spectrogram_power_plot() { std::shared_ptr sp{}; QMenu* menu{}; void init() override { - Plot::init(); + Latency_Eager_Plot::init(); object_name = "Spectrum_Plot"; auto data = create_renderable_node(get_root_renderable(), "Data_Renderable"); - auto axis = create_renderable_node(get_root_renderable(), "Axis_Renderable"); + auto frequency_axis_cache = create_renderable_node(get_root_renderable(), "Frequency_Axis_Cache"); + auto power_axis_cache = create_renderable_node(get_root_renderable(), "Power_Axis_Cache"); auto overlay = create_renderable_node(get_root_renderable(), "Overlay_Renderable"); - x_axis = renderive::Frequency_Axis::Builder(axis, Qt::Horizontal) + frequency_axis_cache->set_cache_mode(renderive::Renderable_Cache_Mode::Local_Pixel); + power_axis_cache->set_cache_mode(renderive::Renderable_Cache_Mode::Local_Pixel); + x_axis = renderive::Frequency_Axis::Builder(frequency_axis_cache, Qt::Horizontal) .set_tick_length(-10) .set_coord_range(frequent_range) .set_tick_length(-10) .set_sub_tick_length(-5) .build(); - y_axis = renderive::Axis::Builder(axis, Qt::Vertical) + y_axis = renderive::Axis::Builder(power_axis_cache, Qt::Vertical) .set_coord_range({160, 0}) .set_unit_text("功率") .build(); @@ -79,7 +82,7 @@ QWidget* Intermediate_Frequency_Widget::create_spectrogram_power_plot() { return w; } QWidget* Intermediate_Frequency_Widget::create_Afterglow_Plot() { - class Afterglow_Plot : public renderive::Plot { + class Afterglow_Plot : public renderive::Latency_Eager_Plot { public: std::shared_ptr x_axis{}; std::shared_ptr y_axis{}; @@ -87,18 +90,21 @@ QWidget* Intermediate_Frequency_Widget::create_Afterglow_Plot() { std::shared_ptr msr{}; QMenu* menu{}; void init() override { - Plot::init(); + Latency_Eager_Plot::init(); object_name = "Afterglow_Plot"; auto data = create_renderable_node(get_root_renderable(), "Data_Renderable"); - auto axis = create_renderable_node(get_root_renderable(), "Axis_Renderable"); + auto frequency_axis_cache = create_renderable_node(get_root_renderable(), "Frequency_Axis_Cache"); + auto power_axis_cache = create_renderable_node(get_root_renderable(), "Power_Axis_Cache"); auto overlay = create_renderable_node(get_root_renderable(), "Overlay_Renderable"); - x_axis = renderive::Frequency_Axis::Builder(axis, Qt::Horizontal) + frequency_axis_cache->set_cache_mode(renderive::Renderable_Cache_Mode::Local_Pixel); + power_axis_cache->set_cache_mode(renderive::Renderable_Cache_Mode::Local_Pixel); + x_axis = renderive::Frequency_Axis::Builder(frequency_axis_cache, Qt::Horizontal) .set_coord_range(frequent_range) .set_tick_length(-10) .set_sub_tick_length(-5) .set_use_drag(true) .build(); - y_axis = renderive::Axis::Builder(axis, Qt::Vertical) + y_axis = renderive::Axis::Builder(power_axis_cache, Qt::Vertical) .set_coord_range({160, 0}) .set_use_drag(true) .build(); diff --git a/module/radio/BackEnd/RadioWidget.cpp b/module/radio/BackEnd/RadioWidget.cpp index 6ddfb92..161980a 100644 --- a/module/radio/BackEnd/RadioWidget.cpp +++ b/module/radio/BackEnd/RadioWidget.cpp @@ -1,4 +1,4 @@ -#include "RadioWidget.h" +#include "RadioWidget.h" #include #include #include @@ -22,16 +22,15 @@ static bool radio_show_performance_overlay() { int value = qEnvironmentVariableIntValue("RADIO_SHOW_PERFORMANCE_OVERLAY", &ok); return ok ? value != 0 : false; } -static void configure_radio_plot_perf(renderive::Plot* plot) { +static void configure_radio_plot_perf(renderive::Latency_Eager_Plot* plot) { if (!radio_mock_perf_mode()) return; plot->set_max_render_fps(1000); - plot->set_render_schedule_mode(renderive::Plot_Render_Schedule_Mode::Feedback); if (radio_show_performance_overlay()) plot->set_use_performance_shower(true); } QWidget* Radio_Widget::create_spectrogram_power_plot() { - class Spectrum_Plot : public renderive::Plot { + class Spectrum_Plot : public renderive::Latency_Eager_Plot { public: std::shared_ptr x_axis{}; std::shared_ptr y_axis{}; @@ -39,20 +38,25 @@ QWidget* Radio_Widget::create_spectrogram_power_plot() { std::shared_ptr sp{}; QMenu* menu{}; void init() override { - Plot::init(); + Latency_Eager_Plot::init(); configure_radio_plot_perf(this); object_name = "Spectrum_Plot"; auto data = create_renderable_node(get_root_renderable(), "Data_Renderable"); - auto axis = create_renderable_node(get_root_renderable(), "Axis_Renderable"); + // auto frequency_axis_cache = create_renderable_node(get_root_renderable(), "Frequency_Axis_Cache"); + // auto power_axis_cache = create_renderable_node(get_root_renderable(), "Power_Axis_Cache"); + // frequency_axis_cache->set_cache_mode(renderive::Renderable_Cache_Mode::Local_Pixel); + // power_axis_cache->set_cache_mode(renderive::Renderable_Cache_Mode::Local_Pixel); + auto axis_cache = create_renderable_node(get_root_renderable(), "Power_Axis_Cache"); + axis_cache->set_cache_mode(renderive::Renderable_Cache_Mode::Local_Pixel); auto overlay = create_renderable_node(get_root_renderable(), "Overlay_Renderable"); - x_axis = renderive::Frequency_Axis::Builder(axis, Qt::Horizontal) - .set_coord_range(frequent_range) - .set_tick_length(-10) - .build(); - y_axis = renderive::Axis::Builder(axis, Qt::Vertical) - .set_coord_range({max, 0}) - .set_unit_text("功率") - .build(); + x_axis = renderive::Frequency_Axis::Builder(axis_cache, Qt::Horizontal) + .set_coord_range(frequent_range) + .set_tick_length(-10) + .build(); + y_axis = renderive::Axis::Builder(axis_cache, Qt::Vertical) + .set_coord_range({max, 0}) + .set_unit_text("功率") + .build(); sp = renderive::Spectrum::Builder(data, x_axis, y_axis) .set_frequency_range(frequent_range) .set_frequency_point_size(1024) @@ -72,10 +76,10 @@ QWidget* Radio_Widget::create_spectrogram_power_plot() { void contextMenuEvent(QContextMenuEvent* event) override { if (!menu) { auto ws = concat_widgets( - bw(cw(sp.get(), -1), "频谱图"), - bw(cw(x_axis.get()), "频率x轴"), - bw(cw(y_axis.get()), "功率y轴"), - bw(cw(msr.get()), "多选框")); + bw(cw(sp.get(), -1), "频谱图"), + bw(cw(x_axis.get()), "频率x轴"), + bw(cw(y_axis.get()), "功率y轴"), + bw(cw(msr.get()), "多选框")); menu = create_menu(this, ws); } menu->exec(event->globalPos()); @@ -96,7 +100,7 @@ QWidget* Radio_Widget::create_spectrogram_power_plot() { return w; } QWidget* Radio_Widget::create_water_fall_plot() { - class Water_Fall_Plot : public renderive::Plot { + class Water_Fall_Plot : public renderive::Latency_Eager_Plot { public: std::shared_ptr x_axis{}; std::shared_ptr y_axis{}; @@ -104,25 +108,28 @@ QWidget* Radio_Widget::create_water_fall_plot() { std::shared_ptr wf{}; QMenu* menu{}; void init() override { - Plot::init(); + Latency_Eager_Plot::init(); configure_radio_plot_perf(this); object_name = "Water_Fall_Plot"; - auto data = create_renderable_node(get_root_renderable(), "Data_Renderable"); - auto axis = create_renderable_node(get_root_renderable(), "Axis_Renderable"); + auto stream_cache = create_renderable_node(get_root_renderable(), "Waterfall_Stream_Cache"); + auto data = create_renderable_node(stream_cache, "Data_Renderable"); + auto time_axis = create_renderable_node(stream_cache, "Time_Axis_Renderable"); + auto frequency_axis_cache = create_renderable_node(get_root_renderable(), "Frequency_Axis_Cache"); auto overlay = create_renderable_node(get_root_renderable(), "Overlay_Renderable"); - x_axis = renderive::Frequency_Axis::Builder(axis, Qt::Horizontal) - .set_tick_length(-10) - .set_sub_tick_length(-5) - .set_coord_range(frequent_range) - .build(); - y_axis = renderive::Time_Axis::Builder(axis, Qt::Vertical) - .set_time_point_size(100) - .build(); + stream_cache->set_cache_mode(renderive::Renderable_Cache_Mode::Local_Pixel); + frequency_axis_cache->set_cache_mode(renderive::Renderable_Cache_Mode::Local_Pixel); + x_axis = renderive::Frequency_Axis::Builder(frequency_axis_cache, Qt::Horizontal) + .set_tick_length(-10) + .set_sub_tick_length(-5) + .set_coord_range(frequent_range) + .build(); + y_axis = renderive::Time_Axis::Builder(time_axis, Qt::Vertical) + .set_time_point_size(100) + .build(); wf = renderive::Waterfall::Builder(data, x_axis, y_axis) .set_frequency_range(frequent_range) .set_frequency_point_size(1024) .set_power_range({0, max}) - // .set_time_point_size(100) .build(); msr = renderive::Multi_Select_Rect::Builder(overlay, x_axis, y_axis).build(); if (use_Performance_shower) set_use_performance_shower(true); @@ -139,10 +146,10 @@ QWidget* Radio_Widget::create_water_fall_plot() { void contextMenuEvent(QContextMenuEvent* event) override { if (!menu) { auto ws = concat_widgets( - bw(cw(wf.get(), -1), "瀑布图"), - bw(cw(x_axis.get()), "频率轴"), - bw(cw(y_axis.get()), "时间轴"), - bw(cw(msr.get()), "多选框")); + bw(cw(wf.get(), -1), "瀑布图"), + bw(cw(x_axis.get()), "频率轴"), + bw(cw(y_axis.get()), "时间轴"), + bw(cw(msr.get()), "多选框")); menu = create_menu(this, ws); } menu->exec(event->globalPos()); @@ -154,7 +161,7 @@ QWidget* Radio_Widget::create_water_fall_plot() { return w; } QWidget* Radio_Widget::create_audio_spectrogram_plot() { - class Spectrum_Plot : public renderive::Plot { + class Spectrum_Plot : public renderive::Latency_Eager_Plot { public: std::shared_ptr x_axis{}; std::shared_ptr y_axis{}; @@ -162,20 +169,23 @@ QWidget* Radio_Widget::create_audio_spectrogram_plot() { std::shared_ptr sp{}; QMenu* menu{}; void init() override { - Plot::init(); + Latency_Eager_Plot::init(); configure_radio_plot_perf(this); object_name = "Spectrum_Plot"; auto data = create_renderable_node(get_root_renderable(), "Data_Renderable"); - auto axis = create_renderable_node(get_root_renderable(), "Axis_Renderable"); + auto frequency_axis_cache = create_renderable_node(get_root_renderable(), "Frequency_Axis_Cache"); + auto power_axis_cache = create_renderable_node(get_root_renderable(), "Power_Axis_Cache"); auto overlay = create_renderable_node(get_root_renderable(), "Overlay_Renderable"); - x_axis = renderive::Frequency_Axis::Builder(axis, Qt::Horizontal) - .set_coord_range({-12000, 12000}) - .set_tick_length(-10) - .set_sub_tick_length(-5) - .build(); - y_axis = renderive::Axis::Builder(axis, Qt::Vertical) - .set_coord_range({12000, -12000}) - .set_unit_text("功率").build(); + frequency_axis_cache->set_cache_mode(renderive::Renderable_Cache_Mode::Local_Pixel); + power_axis_cache->set_cache_mode(renderive::Renderable_Cache_Mode::Local_Pixel); + x_axis = renderive::Frequency_Axis::Builder(frequency_axis_cache, Qt::Horizontal) + .set_coord_range({-12000, 12000}) + .set_tick_length(-10) + .set_sub_tick_length(-5) + .build(); + y_axis = renderive::Axis::Builder(power_axis_cache, Qt::Vertical) + .set_coord_range({12000, -12000}) + .set_unit_text("功率").build(); sp = renderive::Spectrum::Builder(data, x_axis, y_axis) .set_frequency_range({-12000, 12000}) .set_frequency_point_size(512) @@ -195,10 +205,10 @@ QWidget* Radio_Widget::create_audio_spectrogram_plot() { void contextMenuEvent(QContextMenuEvent* event) override { if (!menu) { auto ws = concat_widgets( - bw(cw(sp.get(), -1), "频谱图"), - bw(cw(x_axis.get()), "频率x轴"), - bw(cw(y_axis.get()), "功率y轴"), - bw(cw(msr.get()), "多选框")); + bw(cw(sp.get(), -1), "频谱图"), + bw(cw(x_axis.get()), "频率x轴"), + bw(cw(y_axis.get()), "功率y轴"), + bw(cw(msr.get()), "多选框")); menu = create_menu(this, ws); } menu->exec(event->globalPos()); @@ -210,7 +220,7 @@ QWidget* Radio_Widget::create_audio_spectrogram_plot() { return w; } QWidget* Radio_Widget::create_time_power_plot() { - class Audio_Plot : public renderive::Plot { + class Audio_Plot : public renderive::Latency_Eager_Plot { public: std::shared_ptr x_axis{}; std::shared_ptr y_axis{}; @@ -218,19 +228,23 @@ QWidget* Radio_Widget::create_time_power_plot() { std::shared_ptr msr{}; QMenu* menu{}; void init() override { - Plot::init(); + Latency_Eager_Plot::init(); configure_radio_plot_perf(this); object_name = "Audio_Plot"; - auto data = create_renderable_node(get_root_renderable(), "Data_Renderable"); - auto axis = create_renderable_node(get_root_renderable(), "Axis_Renderable"); + auto stream_cache = create_renderable_node(get_root_renderable(), "Audio_Stream_Cache"); + auto data = create_renderable_node(stream_cache, "Data_Renderable"); + auto time_axis = create_renderable_node(stream_cache, "Time_Axis_Renderable"); + auto power_axis_cache = create_renderable_node(get_root_renderable(), "Power_Axis_Cache"); auto overlay = create_renderable_node(get_root_renderable(), "Overlay_Renderable"); - x_axis = renderive::Time_Axis::Builder(axis, Qt::Horizontal) - .set_tick_length(-10) - .set_sub_tick_length(-5) - .build(); - y_axis = renderive::Axis::Builder(axis, Qt::Vertical) - .set_coord_range({12000, -12000}) - .build(); + stream_cache->set_cache_mode(renderive::Renderable_Cache_Mode::Local_Pixel); + power_axis_cache->set_cache_mode(renderive::Renderable_Cache_Mode::Local_Pixel); + x_axis = renderive::Time_Axis::Builder(time_axis, Qt::Horizontal) + .set_tick_length(-10) + .set_sub_tick_length(-5) + .build(); + y_axis = renderive::Axis::Builder(power_axis_cache, Qt::Vertical) + .set_coord_range({12000, -12000}) + .build(); audio = renderive::Audio_Frequency::Builder(data, x_axis, y_axis) .build(); msr = renderive::Multi_Select_Rect::Builder(overlay, x_axis, y_axis).build(); @@ -249,10 +263,10 @@ QWidget* Radio_Widget::create_time_power_plot() { void contextMenuEvent(QContextMenuEvent* event) override { if (!menu) { auto ws = concat_widgets( - bw(cw(audio.get(), -1), "音频图"), - bw(cw(y_axis.get()), "功率y轴"), - bw(cw(x_axis.get()), "时间轴"), - bw(cw(msr.get()), "多选框")); + bw(cw(audio.get(), -1), "音频图"), + bw(cw(y_axis.get()), "功率y轴"), + bw(cw(x_axis.get()), "时间轴"), + bw(cw(msr.get()), "多选框")); menu = create_menu(this, ws); } menu->exec(event->globalPos()); @@ -284,22 +298,22 @@ Radio_Widget::Radio_Widget(QWidget* parent) : Base_Widget(parent) { } QColor orange(255, 165, 0); progress_bar1 = new Progress_Bar({ - Tick("S", Qt::black), - {"3", Qt::black}, - {"6", Qt::black}, - {"9", Qt::black}, - {"20", Qt::black}, - {"40", orange}, - {"60", orange}, - {"100", orange}, - {"+160", Qt::red}, - }, this); + Tick("S", Qt::black), + {"3", Qt::black}, + {"6", Qt::black}, + {"9", Qt::black}, + {"20", Qt::black}, + {"40", orange}, + {"60", orange}, + {"100", orange}, + {"+160", Qt::red}, + }, this); progress_bar2 = new Progress_Bar({ - {"1", Qt::black}, - {"2", Qt::yellow}, - {"3", Qt::red}, - {">5", Qt::red}, - }, this); + {"1", Qt::black}, + {"2", Qt::yellow}, + {"3", Qt::red}, + {">5", Qt::red}, + }, this); progress_bar1->tick_space_w = 2.0f; auto main = create_vbox_layout({}, this); main->addStretch(1); diff --git a/module/radio/BackEnd/SweepFrequencyWidget.cpp b/module/radio/BackEnd/SweepFrequencyWidget.cpp index f602a27..1ab8c2e 100644 --- a/module/radio/BackEnd/SweepFrequencyWidget.cpp +++ b/module/radio/BackEnd/SweepFrequencyWidget.cpp @@ -11,7 +11,7 @@ #include "../menu/BaseWidgetMenu.h" #include "Renderive/base/Tool.h" QWidget* Sweep_Frequency_Widget::create_spectrogram_power_plot() { - class Sweep_Frequent_Plot : public renderive::Plot { + class Sweep_Frequent_Plot : public renderive::Latency_Eager_Plot { public: std::shared_ptr x_axis{}; std::shared_ptr y_axis{}; @@ -19,15 +19,18 @@ QWidget* Sweep_Frequency_Widget::create_spectrogram_power_plot() { std::shared_ptr sf{}; QMenu* menu{}; void init() override { - Plot::init(); + Latency_Eager_Plot::init(); object_name = "Axis_Test_Plot"; auto data = create_renderable_node(get_root_renderable(), "Data_Renderable"); - auto axis = create_renderable_node(get_root_renderable(), "Axis_Renderable"); + auto x_axis_cache = create_renderable_node(get_root_renderable(), "X_Axis_Cache"); + auto y_axis_cache = create_renderable_node(get_root_renderable(), "Y_Axis_Cache"); auto overlay = create_renderable_node(get_root_renderable(), "Overlay_Renderable"); - x_axis = renderive::Axis::Builder(axis, Qt::Horizontal) + x_axis_cache->set_cache_mode(renderive::Renderable_Cache_Mode::Local_Pixel); + y_axis_cache->set_cache_mode(renderive::Renderable_Cache_Mode::Local_Pixel); + x_axis = renderive::Axis::Builder(x_axis_cache, Qt::Horizontal) .set_coord_range({0, 100}) .set_tick_length(-10).build(); - y_axis = renderive::Axis::Builder(axis, Qt::Vertical) + y_axis = renderive::Axis::Builder(y_axis_cache, Qt::Vertical) .set_coord_range({100, 0}) .set_tick_length(-10).build(); sf = renderive::Sweep_Frequency::Builder(data, x_axis, y_axis) diff --git a/module/radio/main.cpp b/module/radio/main.cpp index 2c85bc5..19298bf 100644 --- a/module/radio/main.cpp +++ b/module/radio/main.cpp @@ -6,6 +6,7 @@ #include "./BackEnd/MainWidget.h" #include "Application.h" #include "Renderive/architecture/export.h" +#include "Renderive/plot/Plot.h" int main(int argc, char* argv[]) { Application app(argc, argv); Application::setAttribute(Qt::AA_UseHighDpiPixmaps);