|
|
@@ -19,20 +19,39 @@ |
|
|
|
#include <QTextEdit> |
|
|
|
#include <QDockWidget> |
|
|
|
#include <QStatusBar> |
|
|
|
|
|
|
|
#include<QLabel> |
|
|
|
MainWindow::MainWindow(QWidget *parent) |
|
|
|
: QMainWindow(parent) |
|
|
|
{ |
|
|
|
setWindowTitle("综合平台编程器"); |
|
|
|
setGeometry(500, 200, 1000, 700); |
|
|
|
m_tabWidget = new QTabWidget(this);// 初始化标签页 |
|
|
|
m_tabWidget->setTabsClosable(true); |
|
|
|
setCentralWidget(m_tabWidget); |
|
|
|
connect(m_tabWidget, &QTabWidget::currentChanged, this, &MainWindow::onTabChanged); |
|
|
|
connect(m_tabWidget, &QTabWidget::tabCloseRequested, this, &MainWindow::onCloseTab); |
|
|
|
createMenus();// 创建菜单和工具栏 |
|
|
|
createToolbars(); |
|
|
|
createLogPanel(); // 创建日志面板 |
|
|
|
setGeometry(500, 200, 1000, 700); |
|
|
|
|
|
|
|
// 1. 先创建中央区域 |
|
|
|
QWidget* centralContainer = new QWidget; |
|
|
|
QHBoxLayout* centralLayout = new QHBoxLayout(centralContainer); |
|
|
|
centralLayout->setContentsMargins(0, 0, 0, 0); |
|
|
|
|
|
|
|
// 2. 左侧工具栏区 |
|
|
|
createToolbars(); // 创建工具栏对象 |
|
|
|
centralLayout->addWidget(m_leftToolBar); |
|
|
|
|
|
|
|
// 3. 中央文档区 |
|
|
|
m_tabWidget = new QTabWidget; |
|
|
|
m_tabWidget->setTabsClosable(true); |
|
|
|
centralLayout->addWidget(m_tabWidget, 1); // 占据剩余空间 |
|
|
|
|
|
|
|
// 4. 设置中央部件 |
|
|
|
setCentralWidget(centralContainer); |
|
|
|
|
|
|
|
// 5. 创建日志面板 |
|
|
|
createLogPanel(); |
|
|
|
|
|
|
|
// 连接信号 |
|
|
|
connect(m_tabWidget, &QTabWidget::currentChanged, this, &MainWindow::onTabChanged); |
|
|
|
connect(m_tabWidget, &QTabWidget::tabCloseRequested, this, &MainWindow::onCloseTab); |
|
|
|
|
|
|
|
// 创建菜单 |
|
|
|
createMenus(); |
|
|
|
} |
|
|
|
|
|
|
|
MainWindow::~MainWindow() |
|
|
@@ -41,49 +60,44 @@ MainWindow::~MainWindow() |
|
|
|
|
|
|
|
void MainWindow::createLogPanel() |
|
|
|
{ |
|
|
|
// 创建可停靠窗口 |
|
|
|
m_logDock = new QDockWidget("消息输出", this); |
|
|
|
// 设置为只能在底部停靠 |
|
|
|
m_logDock->setAllowedAreas(Qt::BottomDockWidgetArea); |
|
|
|
m_logDock->setFeatures(QDockWidget::DockWidgetClosable | |
|
|
|
QDockWidget::DockWidgetMovable | |
|
|
|
QDockWidget::DockWidgetFloatable); |
|
|
|
|
|
|
|
m_logDock->setMinimumHeight(150);//设置高度范围 |
|
|
|
m_logDock->setMinimumHeight(150); |
|
|
|
m_logDock->setMaximumHeight(400); |
|
|
|
|
|
|
|
QWidget* logWidget = new QWidget;// 创建主内容部件 |
|
|
|
QVBoxLayout* logLayout = new QVBoxLayout; |
|
|
|
logLayout->setContentsMargins(2, 2, 2, 2); |
|
|
|
|
|
|
|
m_logEdit = new QTextEdit;// 创建文本编辑框用于显示日志 |
|
|
|
// 创建日志编辑框(启用自定义菜单) |
|
|
|
m_logEdit = new QTextEdit; |
|
|
|
m_logEdit->setReadOnly(true); |
|
|
|
m_logEdit->setFont(QFont("Consolas", 10)); |
|
|
|
m_logEdit->setStyleSheet("background-color: #f8f8f8; border: 1px solid #d9d9d9;"); |
|
|
|
m_logEdit->setMinimumHeight(100); |
|
|
|
|
|
|
|
QHBoxLayout* btnLayout = new QHBoxLayout;// 创建控制按钮 |
|
|
|
m_clearLogBtn = new QPushButton("清空日志"); |
|
|
|
|
|
|
|
btnLayout->addWidget(m_clearLogBtn); |
|
|
|
btnLayout->addStretch(); |
|
|
|
|
|
|
|
// 组合布局 |
|
|
|
logLayout->addLayout(btnLayout); |
|
|
|
logLayout->addWidget(m_logEdit); |
|
|
|
logWidget->setLayout(logLayout); |
|
|
|
// 关键修改:启用自定义右键菜单 |
|
|
|
m_logEdit->setContextMenuPolicy(Qt::CustomContextMenu); // 禁用默认菜单[4,5](@ref) |
|
|
|
connect(m_logEdit, &QTextEdit::customContextMenuRequested, |
|
|
|
this, &MainWindow::showLogContextMenu); // 连接自定义菜单信号 |
|
|
|
|
|
|
|
m_logDock->setWidget(logWidget); |
|
|
|
// 添加到底部dock区域,这会使它横跨整个窗口宽度 |
|
|
|
// 直接以日志编辑框作为面板内容 |
|
|
|
m_logDock->setWidget(m_logEdit); |
|
|
|
addDockWidget(Qt::BottomDockWidgetArea, m_logDock); |
|
|
|
} |
|
|
|
void MainWindow::showLogContextMenu(const QPoint &pos) |
|
|
|
{ |
|
|
|
QMenu menu; // 无需持久化,每次右键时创建 |
|
|
|
|
|
|
|
// 初始显示状态 |
|
|
|
m_logDock->show(); |
|
|
|
// 1. 添加“复制”功能(复用系统功能) |
|
|
|
QAction* copyAction = menu.addAction("复制"); |
|
|
|
connect(copyAction, &QAction::triggered, m_logEdit, &QTextEdit::copy); // 直接调用QTextEdit的复制功能[2,5](@ref) |
|
|
|
|
|
|
|
// 连接信号 |
|
|
|
connect(m_clearLogBtn, &QPushButton::clicked, this, &MainWindow::onClearLogButtonClicked); |
|
|
|
} |
|
|
|
// 2. 添加“清空日志”功能 |
|
|
|
QAction* clearAction = menu.addAction("清空日志"); |
|
|
|
connect(clearAction, &QAction::triggered, this, &MainWindow::onClearLogButtonClicked); |
|
|
|
|
|
|
|
// 3. 显示菜单(无其他项) |
|
|
|
menu.exec(m_logEdit->viewport()->mapToGlobal(pos)); // 精准显示在点击位置[4](@ref) |
|
|
|
} |
|
|
|
// 槽函数实现 |
|
|
|
void MainWindow::onClearLogButtonClicked() |
|
|
|
{ |
|
|
|