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