#include "Demo_Gallery.h" #include #include "Widget/Qt/export.h" using namespace Psc; QStandardItem* Demo_Gallery::get_from_data(const T_Data& data) { auto w = new QWidget; auto l = new QVBoxLayout(w); l->setContentsMargins({0, 0, 0, 0}); l->setSpacing(0); l->addWidget(data.plot); // l->addStretch(); data_map[data.name] = w; return new QStandardItem(data.name); } std::vector Demo_Gallery::get_list(const std::vector& datas) { std::vector ret; for (const T_Data& data : datas) { ret.push_back(get_from_data(data)); } return ret; } void Demo_Gallery::change_to(const QString& name) { if (data_map.contains(name)) { QWidget* associatedWidget = data_map[name]; int i = tab_widget->indexOf(associatedWidget); if (i == -1) { // 标签页不存在,添加新的标签页 tab_widget->addTab(associatedWidget, name); tab_widget->setCurrentIndex(tab_widget->indexOf(associatedWidget)); } else { // 标签页已经存在,设置为当前标签页 tab_widget->setCurrentIndex(i); } } } class Combo_Box_Example : public QWidget { public: Combo_Box_Example(QWidget* parent = nullptr) : QWidget(parent) { // 创建一个QComboBox QComboBox* combo_box = new QComboBox(this); // 向QComboBox添加一些选项 combo_box->addItem("Option 1"); combo_box->addItem("Option 2"); combo_box->addItem("Option 3"); // 创建一个标签用来显示选中的选项 QLabel* label = new QLabel("Selected: ", this); QObject::connect(combo_box, QOverload::of(&QComboBox::currentIndexChanged), [=](int index) { // 这里你可以获取当前选择项的索引 label->setText("Selected: " + combo_box->currentText()); }); // 布局 QVBoxLayout* layout = new QVBoxLayout; layout->addWidget(combo_box); layout->addWidget(label); setLayout(layout); } }; Demo_Gallery::Demo_Gallery() : tree_view(new QTreeView(this)), standard_model(new QStandardItemModel(this)), tab_widget(new QTabWidget) { main_layout = new QHBoxLayout(this); main_layout->setContentsMargins(0, 0, 0, 0); main_layout->setSpacing(0); tree_view->setFixedWidth(200); tree_view->setEditTriggers(QAbstractItemView::NoEditTriggers); main_layout->addWidget(tree_view); tab_widget->setTabsClosable(true); main_layout->addWidget(tab_widget); // tree_view->setItemDelegate(new Delegate); tree_view->setHeaderHidden(true); QStandardItem* root = standard_model->invisibleRootItem(); auto append_rows = [](QStandardItem* parent, const std::vector& rows) { for (QStandardItem* row : rows) parent->appendRow(row); }; auto plottable = new QStandardItem("plottable"); append_rows(plottable, get_list({ {"余晖图", create_afterglow()}, {"音频图", create_audio_plot()}, {"星座图", create_planisphere_plot()}, {"频谱图", create_spectrun_plot()}, {"瀑布图", create_water_fall_plot()}, {"扫频图", create_sweep_frequent_plot()}, })); auto base = new QStandardItem("基础元素"); append_rows(base, get_list({ {"轴测试", create_axis_test_plot()}, {"时间轴测试", create_time_axis_test_plot()}, {"频率轴测试", create_frequent_axis_test_plot()}, {"多选框测试", create_Multi_Select_Plot()}, })); auto t1 = new Byte_Select; auto t2 = new Test_File_Gather_Widget; auto t3 = new Test_File_Play_Widget; auto custom_widget = new QStandardItem("自定义控件"); append_rows(custom_widget, get_list({ {"Enum_Select", t1}, {"Test_File_Gather_Widget", t2}, {"Test_File_Play_Widget", t3}, {"表格", create_table_view()}, {"树", create_Tree_View()}, })); auto Qt_raw_widget = new QStandardItem("Qt原生元素"); append_rows(Qt_raw_widget, get_list({ // QSizeGrip 一个改变大小的注脚 // QDesktopWidget 不知道干嘛的 // QFocusFrame 不知道干嘛的 {"QKeySequenceEdit", new QKeySequenceEdit}, {"Combo_Box_Example", new Combo_Box_Example}, // 像QWidget 但不知到有什么区别 {"QPushButton", new QPushButton}, {"QFrame", new QFrame}, {"QStatusBar", new QStatusBar}, {"QGroupBox", new QGroupBox}, {"QSplashScreen", new QSplashScreen}, {"QAbstractSlider", new QAbstractSlider}, {"QRubberBand::Line", new QRubberBand(QRubberBand::Line)}, {"QRubberBand::Rectangle", new QRubberBand(QRubberBand::Rectangle)}, {"QProgressBar", new QProgressBar()}, {"QDialog", new QDialog}, {"QTabBar", new QTabBar}, {"QDialogButtonBox", new QDialogButtonBox}, {"QCalendarWidget", new QCalendarWidget}, {"QMenuBar", new QMenuBar}, {"QTabWidget", new QTabWidget}, {"QOpenGLWidget", new QOpenGLWidget}, {"QMdiSubWindow", new QMdiSubWindow}, {"QDockWidget", new QDockWidget}, {"QAbstractSpinBox", new QAbstractSpinBox}, //{"QAbstractButton", new QAbstractButton}, {"QTabBar", new QTabBar}, {"QComboBox", new QComboBox}, {"QMainWindow", new QMainWindow}, {"QMenu", new QMenu}, //{"QWindowContainer", new QWindowContainer}, //{"QDesktopScreenWidget", new QDesktopScreenWidget}, {"QColumnView", new QColumnView}, {"QWizardPage", new QWizardPage}, })); // change_to("表格"); change_to("Test_File_Gather_Widget"); // change_to("树"); root->appendRow(plottable); root->appendRow(base); root->appendRow(custom_widget); root->appendRow(Qt_raw_widget); tree_view->setModel(standard_model); tree_view->expandAll(); QObject::connect(tab_widget, &QTabWidget::tabCloseRequested, [this](int index) { // 处理标签页关闭请求 qDebug() << "Closing tab at index:" << index; // 从 QTabWidget 中移除指定的标签页 tab_widget->removeTab(index); }); QObject::connect(tree_view, &QTreeView::clicked, [this](const QModelIndex& index) { QStandardItem* item = this->standard_model->itemFromIndex(index); if (item) { QString item_name = item->text(); change_to(item_name); } }); }