forked from shengxi-rise/WirelessMonitor
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmainwindow.cpp
More file actions
255 lines (227 loc) · 11.5 KB
/
mainwindow.cpp
File metadata and controls
255 lines (227 loc) · 11.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
#include "mainwindow.h"
#include "./ui_mainwindow.h"
#include "ChannelConfiguration/channelconfiguration.h"
#include "ComTool/Comtool.h"
#include "DataCirculation/datacirculation.h"
#include "qcustomplot.h"
#include "qtmaterialappbar.h"
#include "qtmaterialdrawer.h"
#include "SideBarButton/SideBarButton.h"
#include "TCPBridgeConfiguration/tcpbridgeconfiguration.h"
#include "TCPCom/Tcpcom.h"
#include "Charts/charts_next.h"
int record_DeviceNum = 0, record_WinNum = 0;
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui_(new Ui::MainWindow) {
ui_->setupUi(this);
// QVBoxLayout *layout = new QVBoxLayout;
// this->setLayout(layout);
// QWidget *widgetTmp = new QWidget;
// layout->addWidget(widgetTmp);
//
// QWidget *canvas = new QWidget;
// canvas->setStyleSheet("QWidget { background: white; }");
// layout->addWidget(canvas);
//
// layout->setContentsMargins(20, 20, 20, 20);
//
// layout = new QVBoxLayout;
// canvas->setLayout(layout);
// canvas->setMaximumHeight(300);
//
//
m_drawer_ = new QtMaterialDrawer;
cfg_ = new CfgClass;
m_drawer_->setParent(ui_->centralwidget);
m_drawer_->setClickOutsideToClose(true);
m_drawer_->setOverlayMode(true);
m_drawer_->setDrawerWidth(250);
auto *drawer_layout = new QVBoxLayout;
m_drawer_->setDrawerLayout(drawer_layout);
device_select_[0] = new SideBarButton();
drawer_layout->addWidget(device_select_[0]); // 初始化数据聚合窗口
device_count_ = cfg_->device_num_;
for (int i = 1; i <= device_count_; i++) {
device_select_[i] = new SideBarButton(i, cfg_);
drawer_layout->addWidget(device_select_[i]);
connect(device_select_[i]->button_, &QPushButton::pressed, this, [=] { MainWindow::DeviceExchange(i); });
}
connect(ui_->settingButton, SIGNAL(pressed()), m_drawer_, SLOT(openDrawer()));
DeviceWindowsInit();
DeviceExchange(1);
// DeviceWindowsExchange(1, 1);
// DataCirculation *tmp = new DataCirculation(1,
// 5,
// cfg_->config_device_ini_[1],
// &parent_info_);
// ui_->FunctionWindow->setCurrentIndex(ui_->FunctionWindow->addWidget(tmp));
// ui_->FunctionWindow->setCurrentIndex(2);
// devices_info_[1].tab_widget->setCurrentTab(2);
}
MainWindow::~MainWindow() {
delete ui_;
}
/*!
* 错误处理函数,会弹出窗口并结束程序
* @param reason 出错提示
*/
//void MainWindow::ErrorHandle(const QString &reason) {
// int ret = QMessageBox::warning(this, QStringLiteral("Error!"), reason, QMessageBox::Cancel | QMessageBox::Ok);
// std::exit(0);
//}
/*!
* 窗口结构体初始化
*/
void MainWindow::DeviceWindowsInit() {
parent_info_.devices_info = &devices_info_;
parent_info_.devices_windows_info = &devices_windows_info_;
devices_windows_info_.emplace_back(); // 空占位
devices_info_.emplace_back(); // Main窗口
devices_info_[0].tab_index = 0; // 在ui内默认创建,必定是0
for (int device_num = 1; device_num <= device_count_; device_num++) // 设备遍历初始化
{
// 创建Tab栏,初始化DevicesInfo内数据
auto *new_tab = new QtMaterialTabs();
struct DevicesInfo tmp
{
.windows_num = cfg_->GetMainCfg("/Device " + QString::number(device_num) + "/win").toInt(),
.tab_index = ui_->TabStackedWidget->addWidget(new_tab), .tab_widget = new_tab
};
devices_info_.push_back(tmp);
devices_windows_info_.emplace_back(); // 创建行
// 创建socket对象
devices_info_[device_num].tcp_info_handler[1] = new TCPInfoHandle;
devices_info_[device_num].tcp_info_handler[2] = new TCPInfoHandle;
devices_info_[device_num].tcp_info_handler[3] = new TCPInfoHandle;
devices_info_[device_num].tcp_command_handler = new TCPCommandHandle; // 都创建一个socket对象吧,防止空指针
for (int win_num = 1; win_num <= devices_info_[device_num].windows_num; win_num++) // 窗口遍历初始化
{
int win_type = cfg_->GetDeviceCfg(device_num, "/Win" + QString::number(win_num) + "/type").toInt();
if (win_type == 0) {
continue;
}
devices_windows_info_[device_num].emplace_back(); // 0位置空占位
devices_windows_info_[device_num].emplace_back();
RepeaterWidget *tmp_widget = nullptr;
switch (win_type) {
case 1:devices_windows_info_[device_num][win_num].type = CHANNEL_CONFIGURATION; // 结构体初始化
tmp_widget = new ChannelConfiguration(
device_num, cfg_->config_device_ini_[0], cfg_->config_device_ini_[device_num], &parent_info_);
devices_windows_info_[device_num][win_num].widget = tmp_widget;
connect(tmp_widget,
&RepeaterWidget::OrderExchangeWindow,
this,
&MainWindow::ReciveOrderExchangeWindow);//绑定切换窗口的有关事件
devices_windows_info_[device_num][win_num].index =
ui_->FunctionWindow->addWidget(devices_windows_info_[device_num][win_num].widget);
devices_info_[device_num].tab_widget->addTab("通道配置"); // 添加tab栏
break;
case 50:devices_windows_info_[device_num][win_num].type = XCOM; // 结构体初始化
devices_windows_info_[device_num][win_num].widget =
new ComTool(device_num, win_num, cfg_->config_device_ini_[device_num], &parent_info_);
devices_windows_info_[device_num][win_num].index =
ui_->FunctionWindow->addWidget(devices_windows_info_[device_num][win_num].widget);
devices_info_[device_num].tab_widget->addTab("本地串口监视器"); // 添加tab栏
break;
case 51: { // 记录下相应的变量,方便提取类的成员变量charts
record_DeviceNum = device_num;
record_WinNum = win_num;
devices_windows_info_[device_num][win_num].type = MAIN_CHART; // 结构体初始化
ChartsNext
*test_1 =
new ChartsNext(device_num, win_num, cfg_->config_device_ini_[device_num], &parent_info_);
devices_windows_info_[device_num][win_num].widget = test_1;
devices_windows_info_[device_num][win_num].index =
ui_->FunctionWindow->addWidget(devices_windows_info_[device_num][win_num].widget);
devices_info_[device_num].tab_widget->addTab("数据波形图"); // 添加tab栏
// 测试数据添加
// lulu_test
QVector<double> a;
test_1->RegisterDataPoint("test");
break;
}
case 52:devices_windows_info_[device_num][win_num].type = DATA_CIRCULATION; // 结构体初始化
devices_windows_info_[device_num][win_num].widget =
new DataCirculation(device_num, win_num, cfg_->config_device_ini_[device_num], &parent_info_);
devices_windows_info_[device_num][win_num].index =
ui_->FunctionWindow->addWidget(devices_windows_info_[device_num][win_num].widget);
devices_info_[device_num].tab_widget->addTab("数据流过滤器配置"); // 添加tab栏
break;
case 201:devices_windows_info_[device_num][win_num].type = TCP_BRIDGE_CONFIGURATION; // 结构体初始化
tmp_widget =
new TCPBridgeConfiguration(device_num,
win_num,
cfg_->config_device_ini_[device_num],
&parent_info_);
devices_windows_info_[device_num][win_num].widget = tmp_widget;
connect(tmp_widget,
&RepeaterWidget::OrderExchangeWindow,
this,
&MainWindow::ReciveOrderExchangeWindow);//绑定切换窗口的有关事件
devices_windows_info_[device_num][win_num].index =
ui_->FunctionWindow->addWidget(devices_windows_info_[device_num][win_num].widget);
devices_info_[device_num].tab_widget->addTab("串口桥配置"); // 添加tab栏
break;
case 202:devices_windows_info_[device_num][win_num].type = TCP_COM; // 结构体初始化
devices_windows_info_[device_num][win_num].widget =
new TcpCom(device_num, win_num, cfg_->config_device_ini_[device_num], &parent_info_);
devices_windows_info_[device_num][win_num].index =
ui_->FunctionWindow->addWidget(devices_windows_info_[device_num][win_num].widget);
devices_info_[device_num].tab_widget->addTab("串口桥数据监视器"); // 添加tab栏
break;
default:break;
}
}
// Charts test; //图标界面测试
// test.show();
// tab栏绑定
connect(new_tab, &QtMaterialTabs::currentChanged, this, [=](int num) {
// 这里的num从0开始,所以要+1
DeviceWindowsExchange(device_num, num + 1);
});
connect(new_window_create_timer_, &QTimer::timeout, this, [=] {
});
connect(new_window_create_timer_, &QTimer::timeout, this, [=] {
});
}
}
/*!
* 设备切换,被侧边栏切换
* @param num 设备号
*/
void MainWindow::DeviceExchange(int device_num) {
ui_->TabStackedWidget->setCurrentIndex(devices_info_[device_num].tab_index);
DeviceWindowsExchange(device_num, 1);
}
/*!
* 设备内Tab窗口切换
* @param device_num 设备号
* @param win_num 窗口号
*/
void MainWindow::DeviceWindowsExchange(int device_num, int win_num) {
// if(devices_windows_info_[Device_Num][win_num].index==0)
// {
// ErrorHandle("尝试打开不存在的窗口");
// }
qDebug("try to switch %d device, %d windows", device_num, win_num);
// devices_info_[device_num_].tab_widget->setTabActive(win_num);
#if DEBUG
#else
if (devices_info_[device_num].config_step < win_num) {
//TODO:添加提醒用户完成上一步骤
qDebug("Switch Failed");
devices_info_[device_num].tab_widget->setCurrentTab(devices_info_[device_num].current_window - 1,
false);//把高亮回到该窗口
QMessageBox::information(this, tr("提示"), tr("请先完成上一步骤的配置吧"));
return;
}
#endif
ui_->FunctionWindow->setCurrentIndex(devices_windows_info_[device_num][win_num].index);
devices_info_[device_num].current_window = win_num;
}
//void MainWindow::NewWindowCreate() {
//}
void MainWindow::ReciveOrderExchangeWindow(int device, int windows_num) {
DeviceWindowsExchange(device, windows_num);
devices_info_[device].tab_widget->setCurrentTab(windows_num - 1,
false);//调整上面tab的视觉效果
}