feat: sim gui framework
This commit is contained in:
commit
f20912a0e5
|
|
@ -0,0 +1,2 @@
|
||||||
|
/build
|
||||||
|
/bin
|
||||||
File diff suppressed because it is too large
Load Diff
|
|
@ -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,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.
|
||||||
|
|
@ -0,0 +1,12 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
|
||||||
|
namespace sm {
|
||||||
|
|
||||||
|
class IService {
|
||||||
|
public:
|
||||||
|
~IService() = default;
|
||||||
|
/** 向全局窗口发送消息*/
|
||||||
|
virtual void sendMessage(const char* msg, size_t len) noexcept = 0;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
@ -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>
|
||||||
|
|
@ -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;
|
||||||
|
};
|
||||||
|
|
@ -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;
|
||||||
|
}
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 3.4 KiB |
|
|
@ -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)));
|
||||||
|
}
|
||||||
|
|
@ -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);
|
||||||
|
}
|
||||||
|
|
@ -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();
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue