288 lines
12 KiB
C++
288 lines
12 KiB
C++
|
/**
|
||
|
* @file mainwindow.cpp
|
||
|
* @author jinchao
|
||
|
* @brief 主窗口类实现文件
|
||
|
* @version 1.0
|
||
|
* @date 2025-03-10
|
||
|
*
|
||
|
* @copyright Copyright (c) 2025 COMAC
|
||
|
*
|
||
|
*/
|
||
|
#include "mainwindow.h"
|
||
|
#include "./ui_mainwindow.h"
|
||
|
|
||
|
MainWindow::MainWindow(QWidget *parent)
|
||
|
: QMainWindow(parent), ui(new Ui::MainWindow), menuBar(nullptr), viewMenu(nullptr),
|
||
|
debugWidget(nullptr), mainLayout(nullptr), currentTabIndex(0), systemStatusButton(nullptr),
|
||
|
modelStatusButton(nullptr), dataMonitoringButton(nullptr), dataCollectionButton(nullptr),
|
||
|
systemStatusWidget(nullptr), modelStatusWidget(nullptr), dataMonitorWidget(nullptr),
|
||
|
dataCollectionWidget(nullptr), showDebugAction(nullptr)
|
||
|
{
|
||
|
ui->setupUi(this); // 初始化界面
|
||
|
|
||
|
QApplication::setFont(QFont("Arial", 16)); // 设置全局字体大小
|
||
|
|
||
|
setWindowTitle("XNMonitor"); // 设置窗口标题
|
||
|
setWindowIcon(QIcon(":/icon/XNMonitor.png")); // 设置窗口图标
|
||
|
|
||
|
InitialMenuBar(); // 初始化菜单栏
|
||
|
InitialCentralWidget(); // 初始化中央部件
|
||
|
|
||
|
atexit(TopicManager::cleanupParticipant); // 程序结束时清理参与者
|
||
|
}
|
||
|
|
||
|
MainWindow::~MainWindow()
|
||
|
{
|
||
|
// 先断开所有信号连接
|
||
|
if (debugWidget && dataMonitorWidget) {
|
||
|
disconnect(dataMonitorWidget, &DataMonitorWidget::sendDebugMessage, debugWidget,
|
||
|
&DebugWidget::onSendDebugMessage);
|
||
|
disconnect(TopicManager::Instance(), &TopicManager::sendDebugMessage, debugWidget,
|
||
|
&DebugWidget::onSendDebugMessage);
|
||
|
}
|
||
|
|
||
|
// 先删除调试窗口
|
||
|
if (debugWidget) {
|
||
|
debugWidget->hide();
|
||
|
delete debugWidget;
|
||
|
debugWidget = nullptr;
|
||
|
}
|
||
|
|
||
|
// 最后删除 UI
|
||
|
delete ui;
|
||
|
}
|
||
|
|
||
|
void MainWindow::InitialMenuBar()
|
||
|
{
|
||
|
// 初始化菜单栏
|
||
|
menuBar = ui->menubar;
|
||
|
if (menuBar == nullptr) {
|
||
|
menuBar = new QMenuBar(this);
|
||
|
setMenuBar(menuBar);
|
||
|
}
|
||
|
|
||
|
// 创建"视图"菜单
|
||
|
viewMenu = menuBar->addMenu(tr("视图"));
|
||
|
|
||
|
// 创建"显示调试窗口"动作
|
||
|
showDebugAction = new QAction(tr("调试窗口"), this);
|
||
|
viewMenu->addAction(showDebugAction);
|
||
|
|
||
|
// 创建调试窗口
|
||
|
debugWidget = new DebugWidget(this); // 设置父窗口为主窗口
|
||
|
debugWidget->setWindowFlags(Qt::Window | Qt::WindowCloseButtonHint); // 添加关闭按钮
|
||
|
debugWidget->hide(); // 初始隐藏
|
||
|
|
||
|
// 连接动作的触发信号到槽函数
|
||
|
connect(showDebugAction, &QAction::triggered, this, &MainWindow::toggleDebugWidget);
|
||
|
|
||
|
// 连接TopicManager的信号到调试窗口的槽函数
|
||
|
connect(TopicManager::Instance(), &TopicManager::sendDebugMessage, debugWidget,
|
||
|
&DebugWidget::onSendDebugMessage);
|
||
|
}
|
||
|
|
||
|
void MainWindow::InitialCentralWidget()
|
||
|
{
|
||
|
// 创建中央部件和布局
|
||
|
QWidget *centralWidget = ui->centralwidget;
|
||
|
if (centralWidget == nullptr) {
|
||
|
// 设置主窗口的中央部件
|
||
|
centralWidget = new QWidget(this);
|
||
|
setCentralWidget(centralWidget);
|
||
|
}
|
||
|
mainLayout = new QVBoxLayout(centralWidget); // 创建垂直布局
|
||
|
|
||
|
InitialTabButton(); // 初始化标签页按钮
|
||
|
|
||
|
InitialSystemStatusWidget(); // 初始化系统运行状态内容
|
||
|
|
||
|
InitialModelStatusWidget(); // 初始化模型运行状态内容
|
||
|
|
||
|
InitialDataMonitorWidget(); // 初始化模型数据监控内容
|
||
|
|
||
|
InitialDataCollectionWidget(); // 初始化模型数据采集内容
|
||
|
|
||
|
// 初始显示系统状态内容
|
||
|
systemStatusButton->setChecked(true); // 默认选中"仿真状态"按钮
|
||
|
emit setCurrentTabIndex(0);
|
||
|
}
|
||
|
|
||
|
void MainWindow::InitialTabButton()
|
||
|
{
|
||
|
if (mainLayout == nullptr) {
|
||
|
QMessageBox::warning(this, "Error", "Error");
|
||
|
return;
|
||
|
}
|
||
|
// 创建按钮和内容区域
|
||
|
systemStatusButton = new QPushButton("仿真状态", this); // 创建"仿真状态"按钮
|
||
|
modelStatusButton = new QPushButton("模型状态", this); // 创建"模型状态"按钮
|
||
|
dataMonitoringButton = new QPushButton("数据监控", this); // 创建"数据监控"按钮
|
||
|
dataCollectionButton = new QPushButton("数据采集", this); // 创建"数据采集"按钮
|
||
|
|
||
|
// 增大按钮字号
|
||
|
QFont buttonFont = systemStatusButton->font(); // 获取按钮的当前字体
|
||
|
buttonFont.setPointSize(24); // 设置字体大小为24点
|
||
|
systemStatusButton->setFont(buttonFont); // 设置"仿真状态"按钮的字体
|
||
|
modelStatusButton->setFont(buttonFont); // 设置"模型状态"按钮的字体
|
||
|
dataMonitoringButton->setFont(buttonFont); // 设置"数据监控"按钮的字体
|
||
|
dataCollectionButton->setFont(buttonFont); // 设置"数据采集"按钮的字体
|
||
|
systemStatusButton->setCheckable(true); // 使"仿真状态"按钮可切换状态
|
||
|
modelStatusButton->setCheckable(true); // 使"模型状态"按钮可切换状态
|
||
|
dataMonitoringButton->setCheckable(true); // 使"数据监控"按钮可切换状态
|
||
|
dataCollectionButton->setCheckable(true); // 使"数据采集"按钮可切换状态
|
||
|
|
||
|
// 创建一个水平布局来放置按钮
|
||
|
QHBoxLayout *buttonLayout = new QHBoxLayout(); // 创建水平布局
|
||
|
buttonLayout->addWidget(systemStatusButton); // 将"仿真状态"按钮添加到布局中
|
||
|
buttonLayout->addWidget(modelStatusButton); // 将"模型状态"按钮添加到布局中
|
||
|
buttonLayout->addWidget(dataMonitoringButton); // 将"数据监控"按钮添加到布局中
|
||
|
buttonLayout->addWidget(dataCollectionButton); // 将"数据采集"按钮添加到布局中
|
||
|
|
||
|
// 将按钮布局添加到主布局中,并放置在内容区域上方
|
||
|
mainLayout->addLayout(buttonLayout); // 将按钮布局添加到主布局中
|
||
|
|
||
|
// 连接按钮的信号到槽函数
|
||
|
connect(systemStatusButton, &QPushButton::clicked, this,
|
||
|
&MainWindow::showSystemStatusContent); // 连接"仿真状态"按钮的点击信号到槽函数
|
||
|
connect(modelStatusButton, &QPushButton::clicked, this,
|
||
|
&MainWindow::showModelStatusContent); // 连接"模型状态"按钮的点击信号到槽函数
|
||
|
connect(dataMonitoringButton, &QPushButton::clicked, this,
|
||
|
&MainWindow::showDataMonitoringContent); // 连接"数据监控"按钮的点击信号到槽函数
|
||
|
connect(dataCollectionButton, &QPushButton::clicked, this,
|
||
|
&MainWindow::showDataCollectionContent); // 连接"数据采集"按钮的点击信号到槽函数
|
||
|
}
|
||
|
|
||
|
void MainWindow::InitialSystemStatusWidget()
|
||
|
{
|
||
|
if (mainLayout == nullptr) {
|
||
|
QMessageBox::warning(this, "Error", "Error");
|
||
|
return;
|
||
|
}
|
||
|
systemStatusWidget = new SystemStatusWidget(this); // 创建系统运行状态内容界面
|
||
|
connect(this, &MainWindow::setCurrentTabIndex, systemStatusWidget,
|
||
|
&SystemStatusWidget::
|
||
|
onSetCurrentTabIndex); // 连接当前标签页索引到系统运行状态内容界面的槽函数
|
||
|
mainLayout->addWidget(systemStatusWidget); // 将系统运行状态内容界面添加到主布局中
|
||
|
}
|
||
|
|
||
|
void MainWindow::InitialModelStatusWidget()
|
||
|
{
|
||
|
if (mainLayout == nullptr) {
|
||
|
QMessageBox::warning(this, "Error", "Error");
|
||
|
return;
|
||
|
}
|
||
|
modelStatusWidget = new ModelStatusWidget(this, systemStatusWidget); // 创建模型运行状态内容界面
|
||
|
connect(this, &MainWindow::setCurrentTabIndex, modelStatusWidget,
|
||
|
&ModelStatusWidget::
|
||
|
onSetCurrentTabIndex); // 连接当前标签页索引到模型运行状态内容界面的槽函数
|
||
|
connect(
|
||
|
systemStatusWidget, &SystemStatusWidget::updateThreadInfo, modelStatusWidget,
|
||
|
&ModelStatusWidget::
|
||
|
updateThreadInfoPage); // 连接系统运行状态内容界面的线程信息更新信号到模型运行状态内容界面的槽函数
|
||
|
mainLayout->addWidget(modelStatusWidget); // 将模型运行状态内容界面添加到主布局中
|
||
|
}
|
||
|
|
||
|
void MainWindow::InitialDataMonitorWidget()
|
||
|
{
|
||
|
if (mainLayout == nullptr) {
|
||
|
QMessageBox::warning(this, "Error", "Error");
|
||
|
return;
|
||
|
}
|
||
|
dataMonitorWidget = new DataMonitorWidget(this); // 创建模型数据监控内容界面
|
||
|
connect(this, &MainWindow::setCurrentTabIndex, dataMonitorWidget,
|
||
|
&DataMonitorWidget::
|
||
|
onSetCurrentTabIndex); // 连接当前标签页索引到模型数据监控内容界面的槽函数
|
||
|
mainLayout->addWidget(dataMonitorWidget); // 将模型数据监控内容界面添加到主布局中
|
||
|
}
|
||
|
|
||
|
void MainWindow::InitialDataCollectionWidget()
|
||
|
{
|
||
|
if (mainLayout == nullptr) {
|
||
|
QMessageBox::warning(this, "Error", "Error");
|
||
|
return;
|
||
|
}
|
||
|
dataCollectionWidget = new DataCollectionWidget(this); // 创建模型数据采集内容界面
|
||
|
connect(this, &MainWindow::setCurrentTabIndex, dataCollectionWidget,
|
||
|
&DataCollectionWidget::
|
||
|
onSetCurrentTabIndex); // 连接当前标签页索引到模型数据采集内容界面的槽函数
|
||
|
mainLayout->addWidget(dataCollectionWidget); // 将模型数据采集内容界面添加到主布局中
|
||
|
}
|
||
|
|
||
|
// 显示系统状态内容
|
||
|
void MainWindow::showSystemStatusContent()
|
||
|
{
|
||
|
currentTabIndex = 0; // 设置当前标签页索引为0
|
||
|
systemStatusButton->setChecked(true); // 设置"仿真状态"按钮为选中状态
|
||
|
modelStatusButton->setChecked(false); // 设置"模型状态"按钮为未选中状态
|
||
|
dataMonitoringButton->setChecked(false); // 设置"数据监控"按钮为未选中状态
|
||
|
dataCollectionButton->setChecked(false); // 设置"数据采集"按钮为未选中状态
|
||
|
emit setCurrentTabIndex(0); // 发射当前标签页索引信号
|
||
|
}
|
||
|
|
||
|
// 显示模型状态内容
|
||
|
void MainWindow::showModelStatusContent()
|
||
|
{
|
||
|
currentTabIndex = 1; // 设置当前标签页索引为1
|
||
|
systemStatusButton->setChecked(false); // 设置"仿真状态"按钮为未选中状态
|
||
|
modelStatusButton->setChecked(true); // 设置"模型状态"按钮为选中状态
|
||
|
dataMonitoringButton->setChecked(false); // 设置"数据监控"按钮为未选中状态
|
||
|
dataCollectionButton->setChecked(false); // 设置"数据采集"按钮为未选中状态
|
||
|
emit setCurrentTabIndex(1); // 发射当前标签页索引信号
|
||
|
}
|
||
|
|
||
|
// 显示数据监控内容
|
||
|
void MainWindow::showDataMonitoringContent()
|
||
|
{
|
||
|
currentTabIndex = 2; // 设置当前标签页索引为2
|
||
|
systemStatusButton->setChecked(false); // 设置"仿真状态"按钮为未选中状态
|
||
|
modelStatusButton->setChecked(false); // 设置"模型状态"按钮为未选中状态
|
||
|
dataMonitoringButton->setChecked(true); // 设置"数据监控"按钮为选中状态
|
||
|
dataCollectionButton->setChecked(false); // 设置"数据采集"按钮为未选中状态
|
||
|
emit setCurrentTabIndex(2); // 发射当前标签页索引信号
|
||
|
}
|
||
|
|
||
|
// 显示数据采集内容
|
||
|
void MainWindow::showDataCollectionContent()
|
||
|
{
|
||
|
currentTabIndex = 3; // 设置当前标签页索引为3
|
||
|
systemStatusButton->setChecked(false); // 设置"仿真状态"按钮为未选中状态
|
||
|
modelStatusButton->setChecked(false); // 设置"模型状态"按钮为未选中状态
|
||
|
dataMonitoringButton->setChecked(false); // 设置"数据监控"按钮为未选中状态
|
||
|
dataCollectionButton->setChecked(true); // 设置"数据采集"按钮为选中状态
|
||
|
emit setCurrentTabIndex(3); // 发射当前标签页索引信号
|
||
|
}
|
||
|
|
||
|
// 添加新的槽函数实现
|
||
|
void MainWindow::toggleDebugWidget()
|
||
|
{
|
||
|
if (!debugWidget)
|
||
|
return;
|
||
|
|
||
|
if (debugWidget->isHidden()) {
|
||
|
// 计算调试窗口的位置和大小
|
||
|
QPoint pos = this->geometry().topRight();
|
||
|
debugWidget->setGeometry(pos.x(), pos.y(),
|
||
|
400, // 宽度
|
||
|
this->height()); // 与主窗口等高
|
||
|
connect(
|
||
|
dataMonitorWidget, &DataMonitorWidget::sendDebugMessage, debugWidget,
|
||
|
&DebugWidget::onSendDebugMessage); // 连接数据监控窗口的调试消息信号到调试窗口的槽函数
|
||
|
debugWidget->show(); // 显示调试窗口
|
||
|
} else {
|
||
|
disconnect(
|
||
|
dataMonitorWidget, &DataMonitorWidget::sendDebugMessage, debugWidget,
|
||
|
&DebugWidget::onSendDebugMessage); // 断开数据监控窗口的调试消息信号到调试窗口的槽函数
|
||
|
debugWidget->hide(); // 隐藏调试窗口
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void MainWindow::moveEvent(QMoveEvent *event)
|
||
|
{
|
||
|
QMainWindow::moveEvent(event);
|
||
|
if (debugWidget && debugWidget->isVisible()) {
|
||
|
QPoint pos = this->geometry().topRight(); // 获取主窗口的右上角位置
|
||
|
debugWidget->setGeometry(pos.x(), pos.y(), debugWidget->width(),
|
||
|
this->height()); // 设置调试窗口的位置和大小
|
||
|
}
|
||
|
}
|