Files
Radio/module/radio/BackEnd/SweepFrequencyWidget.cpp
2026-08-10 19:55:29 +08:00

149 lines
6.5 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include "SweepFrequencyWidget.h"
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QPainter>
#include <QDebug>
#include "../component/FrequentShower.h"
#include "../component/ProgressBar.h"
#include "../component/ConsoleWidget.h"
#include "../component/ShowTime.h"
#include "../Global.h"
#include "../menu/BaseWidgetMenu.h"
#include "module/radio/Tool.h"
QWidget* Sweep_Frequency_Widget::create_spectrogram_power_plot() {
class Sweep_Frequency_Plot : public renderive::Latency_Eager_Plot {
public:
std::shared_ptr<renderive::Axis> x_axis{};
std::shared_ptr<renderive::Axis> y_axis{};
std::shared_ptr<renderive::Selection_Rectangle_Overlay> msr{};
std::shared_ptr<renderive::Sweep_Spectrum> sf{};
QMenu* menu{};
void init() override {
Latency_Eager_Plot::init();
setObjectName("Axis_Test_Plot");
auto data = create_renderable_node(root_renderable(), "Data_Renderable");
auto x_axis_cache = create_renderable_node(root_renderable(), "X_Axis_Cache");
auto y_axis_cache = create_renderable_node(root_renderable(), "Y_Axis_Cache");
auto overlay = create_renderable_node(root_renderable(), "Overlay_Renderable");
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, renderive::Orientation::Horizontal)
.set_coord_range({0, 100})
.set_tick_length(-10).build();
y_axis = renderive::Axis::Builder(y_axis_cache, renderive::Orientation::Vertical)
.set_coord_range({100, 0})
.set_tick_length(-10).build();
sf = renderive::Sweep_Spectrum::Builder(data, x_axis, y_axis)
.set_block_num(200)
.set_bins_per_block(20)
.set_frequency_range({0, 100})
.build();
msr = renderive::Selection_Rectangle_Overlay::Builder(overlay, x_axis, y_axis).build();
}
protected:
void resizeEvent(QResizeEvent* event) override {
x_axis->set_x(0);
x_axis->set_y(height() - 1);
x_axis->set_pixel_length(width());
y_axis->set_x(0);
y_axis->set_y(0);
y_axis->set_pixel_length(height());
}
void contextMenuEvent(QContextMenuEvent* event) override {
if (!menu) {
auto ws = concat_widgets(
bw(cw(sf.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());
}
};
auto w = new Sweep_Frequency_Plot;
w->init();
sweep_frequency_line = w->sf;
return w;
}
//am, atu, vsql, nb, nr, dnf, pre, att, spl, fil1, agc_a
Sweep_Frequency_Widget::Sweep_Frequency_Widget(QWidget* parent) : Base_Widget(parent) {
setObjectName("扫频界面");
int font_size = 20;
m1 = create_normal("RF Gain\n62", font_size);
m2 = create_normal("FFT SPAN\n100K", font_size);
m3 = create_normal("频率表\n1289.6MHZ", font_size);
m4 = create_normal("MODEM\nRTTY", font_size);
select_value_widget = new Frequent_Shower(this);
progress_bar1 = new Progress_Bar({
{"S", Qt::black},
{"3", Qt::black},
{"5", Qt::black},
{"7", Qt::black},
{"9", Qt::black},
{"+20", Qt::yellow},
{"+40", Qt::yellow},
{"+60", Qt::red},
}, this);
progress_bar2 = new Progress_Bar({
{"1", Qt::black},
{"2", Qt::yellow},
{"3", Qt::red},
{">5", Qt::red},
}, this);
auto main = create_vbox_layout({}, this);
main->addStretch(1);
{
// 中心Layout
auto center = create_hbox_layout();
main->addLayout(center, 7);
auto front = create_vbox_layout();
center->addLayout(front, 1);
front->addWidget(m1, 3);
front->addStretch(1);
front->addWidget(m2, 3);
center->addSpacing(4);
auto middle = create_vbox_layout();
center->addLayout(middle, 9);
middle->addStretch(1);
middle->addWidget(select_value_widget, 4);
auto middle_h = create_hbox_layout();
middle->addLayout(middle_h, 2);
middle_h->addWidget(progress_bar1, 5);
middle_h->addStretch(1);
middle_h->addWidget(progress_bar2, 3);
center->addStretch(5);
center->addSpacing(4);
auto back1 = create_vbox_layout();
center->addLayout(back1, 1);
back1->addWidget(m3, 3);
back1->addStretch(1);
back1->addWidget(m4, 3);
}
main->addStretch(1);
main->addSpacing(8);
//main->addWidget(new TestWidget, 24);
main->addWidget(create_spectrogram_power_plot(), 24);
init_menu();
}
Sweep_Frequency_Widget::~Sweep_Frequency_Widget() {}
void Sweep_Frequency_Widget::focusInEvent(QFocusEvent* event) {
QWidget::focusInEvent(event);
select_value_widget->setFocus();
}
void Sweep_Frequency_Widget::init_menu() {
int font_size = 30;
auto start_freq = new Value_Menu_Button("起始频率:%1 Hz", font_size, [&](Value_Menu_Button* that, bool add) {
that->setValue(that->value + (double)(add ? 1 : -1));
}, -1);
start_freq->setValue(sweep_frequency_line->frequency_range().origin);
auto end_freq = new Value_Menu_Button("终止频率:%1 Hz", font_size, [&](Value_Menu_Button* that, bool add) {
that->setValue(that->value + (double)(add ? 1 : -1));
}, -1);
end_freq->setValue(sweep_frequency_line->frequency_range().target);
auto btn3 = new Menu_Button("设置频率", font_size, [&, start_freq, end_freq]() {
sweep_frequency_line->set_frequency_range({start_freq->value, end_freq->value});
});
base_widget_menu->add_menu_button_on_layout1({start_freq, end_freq, btn3}, 2);
}