feat: sim gui framework

This commit is contained in:
dyz 2025-12-17 22:37:26 +08:00
commit f20912a0e5
17 changed files with 25841 additions and 0 deletions

2
.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
/build
/bin

0
3rd/.gitkeep Normal file
View File

25526
3rd/json.hpp Normal file

File diff suppressed because it is too large Load Diff

73
CMakeLists.txt Normal file
View File

@ -0,0 +1,73 @@
cmake_minimum_required(VERSION 3.16)
project(SimMonitorGUI VERSION 1.0.0 LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)
set(PROJECT_OUTPUT_DIR ${CMAKE_SOURCE_DIR}/bin)
set(PROJECT_LIB_DIR ${CMAKE_SOURCE_DIR}/lib)
if (CMAKE_CXX_COMPILER_ID MATCHES GNU OR CMAKE_CXX_COMPILER_ID MATCHES Clang)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_OUTPUT_DIR}/${CMAKE_BUILD_TYPE})
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_LIB_DIR}/${CMAKE_BUILD_TYPE})
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_LIB_DIR}/${CMAKE_BUILD_TYPE})
elseif(CMAKE_CXX_COMPILER_ID MATCHES MSVC)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_OUTPUT_DIR})
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_LIB_DIR})
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_LIB_DIR})
endif()
set(HEADER_HPP
include/DefineType.h
include/SimMonitorWidget.h
include/GlobalMonitor.h
include/QtClassForward.h
include/QtHeaderPCH.h
include/details/SimMonitorWidgetImpl.h
)
set(SOURCE_CPP
src/main.cpp
src/SimMonitorWidget.cpp
src/SimMonitorWidgetImpl.cpp
)
find_package(Qt5 REQUIRED COMPONENTS Core Widgets Charts)
add_executable(${PROJECT_NAME} ${HEADER_HPP} ${SOURCE_CPP})
#add_library(${PROJECT_NAME} SHARED ${HEADER_HPP} ${SOURCE_CPP})
#add_library(${PROJECT_NAME} STATIC ${HEADER_HPP} ${SOURCE_CPP})
#target_link_directories({PROJECT_NAME} PUBLIC )
target_link_libraries(${PROJECT_NAME} PUBLIC Qt5::Core Qt5::Widgets Qt5::Charts)
target_include_directories(${PROJECT_NAME} PUBLIC include 3rd)
if (MSVC)
add_compile_options($<$<CXX_COMPLIER_ID:MSVC>:/utf-8)
#
set_target_properties(${PROJECT_NAME} PROPERTIES
VS_DEBUGGER_WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}/bin"
)
# qt application main
#target_link_options(${PROJECT_NAME} PRIVATE "/SUBSYSTEM:WINDOWS")
#target_link_options(${PROJECT_NAME} PRIVATE "/ENTRY:mainCRTStartup")
set(CMAKE_CXX_FLAGS_DEBUG "/MDd /Zi /Ob0 /Od /RTC1")
set(CMAKE_CXX_FLAGS_RELEASE "/MD /O2 /Ob2 /DNDEBUG")
add_compile_options(/utf-8 /source-charset:utf-8 /execution-charset:utf-8)
add_compile_definitions(_UNICODE UNICODE)
endif()
target_compile_options(${PROJECT_NAME} PRIVATE
$<$<CXX_COMPILER_ID:GNU>:-Wall -Wextra -Werror>
$<$<CXX_COMPILER_ID:Clang>:-Wall -Wextra -Werror>
$<$<CXX_COMPILER_ID:MSVC>:/W4 /WX>
)
set_property(GLOBAL PROPERTY USE_FOLDERS_ON)

0
include/.gitkeep Normal file
View File

8
include/DefineType.h Normal file
View File

@ -0,0 +1,8 @@
#pragma once
#include <cstddef>
#include <memory>
#include <QWidget>
#include <QMainWindow>
#include "GlobalMonitor.h"
// Define commonly used types and aliases for the project.

12
include/GlobalMonitor.h Normal file
View File

@ -0,0 +1,12 @@
#pragma once
namespace sm {
class IService {
public:
~IService() = default;
/** 向全局窗口发送消息*/
virtual void sendMessage(const char* msg, size_t len) noexcept = 0;
};
}

25
include/QtClassForward.h Normal file
View File

@ -0,0 +1,25 @@
#pragma once
// Forward declarations of commonly used Qt classes to reduce compilation dependencies.
class QLineEdit;
class QTextEdit;
class QPushButton;
class QCheckBox;
class QComboBox;
class QSpinBox;
class QRadioButton;
class QTabWidget;
class QTableWidget;
class QTreeWidget;
class QProgressBar;
class QGroupBox;
class QSlider;
class QScrollBar;
class QLabel;
namespace Qt
{
class QSeries;
class QChartView;
class QChart;
}

34
include/QtHeaderPCH.h Normal file
View File

@ -0,0 +1,34 @@
#pragma once
// class QLineEdit;
// class QTextEdit;
// class QPushButton;
// class QCheckBox;
// class QComboBox;
// class QSpinBox;
// class QRadioButton;
// class QTabWidget;
// class QTableWidget;
// class QTreeWidget;
// class QProgressBar;
// class QGroupBox;
// class QSlider;
// class QScrollBar;
// class QLabel;
#include <QtCore>
// 包含上面这些类的头文件
#include <QtWidgets>
#include <QtCharts>
#include <QLabel>
#include <QLineEdit>
#include <QTextEdit>
#include <QPushButton>
#include <QCheckBox>
#include <QComboBox>
#include <QSpinBox>
#include <QRadioButton>
#include <QTabWidget>
#include <QTableWidget>
#include <QPixMap>
#include <QDockWidget>

View File

@ -0,0 +1,16 @@
#pragma once
#include "DefineType.h"
class SimMonitorWidget : public QMainWindow, public sm::IService
{
Q_OBJECT
public:
explicit SimMonitorWidget(QWidget* w = nullptr);
~SimMonitorWidget();
void sendMessage(const char* msg, size_t len) noexcept override;
private:
struct Impl;
std::unique_ptr<Impl> _impl;
};

View File

@ -0,0 +1,48 @@
#include "QtHeaderPCH.h"
#include "SimMonitorWidget.h"
struct SimMonitorWidget::Impl : public QObject {
Impl(QMainWindow* w);
/** 创建主要内容区域*/
void createContentArea();
/** 创建功能区域*/
void createFunctionArea();
/** 创建工具栏*/
void createToolBar(QWidget* toolBar);
/** 创建标签组件并链接到槽 */
template<typename SlotFunc>
QPushButton* createLabel(const QString& ico, QWidget* parent, SlotFunc&& slot);
/** 创建帧率监控窗口*/
void createFpsWindow();
/** 全局通知消息显示组件 */
QLabel* m_monitor = nullptr;
/** 工具栏*/
QWidget* m_toolBar = nullptr;
/** 主窗口*/
QMainWindow* m_mainWindow = nullptr;
/** 动态功能区域窗口*/
QWidget* m_monitorWin = nullptr;
};
template<typename SlotFunc>
inline QPushButton* SimMonitorWidget::Impl::createLabel(const QString& ico, QWidget* parent, SlotFunc&& slot)
{
QPushButton* button = new QPushButton(parent);
QIcon icon = QIcon(ico);
button->setIcon(icon);
button->adjustSize();
QObject::connect(button, &QPushButton::clicked, this, slot);
return button;
}

0
lib/.gitkeep Normal file
View File

BIN
resouce/icons/fps.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

0
src/.gitkeep Normal file
View File

18
src/SimMonitorWidget.cpp Normal file
View File

@ -0,0 +1,18 @@
#include "SimMonitorWidget.h"
#include "QtHeaderPCH.h"
#include "details/SimMonitorWidgetImpl.h"
SimMonitorWidget::SimMonitorWidget(QWidget* w)
:_impl(std::make_unique<Impl>(this))
{
Q_UNUSED(w);
}
SimMonitorWidget::~SimMonitorWidget()
{
}
void SimMonitorWidget::sendMessage(const char* msg, size_t len) noexcept
{
_impl->m_monitor->setText(QString::fromUtf8(msg, static_cast<int>(len)));
}

View File

@ -0,0 +1,67 @@
#include "QtHeaderPCH.h"
#include "details/SimMonitorWidgetImpl.h"
QT_CHARTS_USE_NAMESPACE;
SimMonitorWidget::Impl::Impl(QMainWindow* w)
:m_mainWindow(w)
{
m_mainWindow->setDockNestingEnabled(true);
QString qss = R"(
QWidget {
border: 2px solid black;
background-color: white;
}
)";
m_mainWindow->setStyleSheet(qss);
createContentArea();
}
void SimMonitorWidget::Impl::createContentArea()
{
QDockWidget* dock = new QDockWidget;
// 创建左侧侧边栏
QWidget* leftSidebar = new QWidget(m_mainWindow);
dock->setWidget(leftSidebar);
m_mainWindow->addDockWidget(Qt::LeftDockWidgetArea, dock);
// 创建主显示区域
createFunctionArea();
}
void SimMonitorWidget::Impl::createFunctionArea()
{
QDockWidget* dock = new QDockWidget;
m_toolBar = new QWidget(m_mainWindow);
createToolBar(m_toolBar);
dock->setWidget(m_toolBar);
dock->setAllowedAreas(Qt::TopDockWidgetArea | Qt::RightDockWidgetArea);
m_mainWindow->addDockWidget(Qt::RightDockWidgetArea, dock);
}
void SimMonitorWidget::Impl::createToolBar(QWidget* toolBar)
{
QHBoxLayout* layout = new QHBoxLayout;
// 获取当前路径
QPushButton* fps = createLabel("../resouce/icons/fps.png", toolBar, &SimMonitorWidget::Impl::createFpsWindow);
layout->addWidget(fps);
toolBar->setLayout(layout);
}
void SimMonitorWidget::Impl::createFpsWindow()
{
QDockWidget* fpsWindow = new QDockWidget;
fpsWindow->setWindowTitle("FPS Monitor");
fpsWindow->setAllowedAreas(Qt::RightDockWidgetArea | Qt::BottomDockWidgetArea);
// 创建一个折线图
QtCharts::QChart* chart = new QtCharts::QChart();
QtCharts::QChartView* chartView = new QtCharts::QChartView(chart, fpsWindow);
fpsWindow->setWidget(chartView);
fpsWindow->resize(400, 300);
m_mainWindow->addDockWidget(Qt::RightDockWidgetArea, fpsWindow);
}

12
src/main.cpp Normal file
View File

@ -0,0 +1,12 @@
#include <iostream>
#include <QApplication>
#include "SimMonitorWidget.h"
int main(int argc, char** argv) {
QApplication app(argc, argv);
SimMonitorWidget monitorWidget;
monitorWidget.resize(800, 600);
monitorWidget.show();
return app.exec();
}