#pragma once #include "base/Tool.h" static QWidget* create_water_fall_plot() { class Waterfall_Plot : public renderive::Latency_Eager_Plot { public: std::shared_ptr x_axis{}; std::shared_ptr y_axis{}; std::shared_ptr msr{}; std::shared_ptr wf{}; QMenu* menu{}; void init() override { Latency_Eager_Plot::init(); 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 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) .build(); y_axis = renderive::Time_Axis::Builder(axis, Qt::Vertical) .set_time_point_size(800) .build(); wf = renderive::Waterfall::Builder(data, x_axis, y_axis) .set_frequency_range({0, 20}) .build(); msr = renderive::Multi_Select_Rect::Builder(overlay, x_axis, y_axis).build(); } protected: void resizeEvent(QResizeEvent* event) override { x_axis->set_x(0); x_axis->set_y(height()); x_axis->set_pixel_size(width()); y_axis->set_x(0); y_axis->set_y(0); y_axis->set_pixel_size(height()); y_axis->set_time_point_size(height()); // wf->set_frequency_point_size(wf->frequency_axis()->get_pixel_point_size()); wf->set_frequency_point_size(width()); } 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()), "多选框")); menu = create_menu(this, ws); } menu->exec(event->globalPos()); } }; auto w = new Waterfall_Plot; w->init(); return w; }