|
|
@@ -5,11 +5,14 @@ |
|
|
|
#include <QTabWidget> |
|
|
|
#include <QMessageBox> |
|
|
|
#include <QVBoxLayout> |
|
|
|
#include <algorithm> // 引入 std::sort |
|
|
|
#include <algorithm> |
|
|
|
|
|
|
|
HMIModule::HMIModule(Ui::MainWindow* ui, QObject *parent) |
|
|
|
: QObject{parent}, ui_(ui), m_scene(nullptr) |
|
|
|
{} |
|
|
|
{ |
|
|
|
// 初始化 m_pageOrder |
|
|
|
m_pageOrder.append(1); // 初始页面 |
|
|
|
} |
|
|
|
|
|
|
|
void HMIModule::setButtonIcon(QAbstractButton *button, const QString &iconPath) |
|
|
|
{ |
|
|
@@ -46,6 +49,10 @@ void HMIModule::init() { |
|
|
|
connect(ui_->deletePage, &QPushButton::clicked, this, &HMIModule::deletePage); |
|
|
|
connect(ui_->prePage, &QPushButton::clicked, this, &HMIModule::prePage); |
|
|
|
connect(ui_->nextPage, &QPushButton::clicked, this, &HMIModule::nextPage); |
|
|
|
|
|
|
|
// 连接信号和槽 |
|
|
|
connect(this, &HMIModule::pageAdded, this, &HMIModule::onPageAdded); |
|
|
|
connect(this, &HMIModule::pageRemoved, this, &HMIModule::onPageRemoved); |
|
|
|
} |
|
|
|
|
|
|
|
void HMIModule::setupNewComponent(HmiComponent* item) |
|
|
@@ -65,14 +72,30 @@ void HMIModule::setupNewComponent(HmiComponent* item) |
|
|
|
|
|
|
|
void HMIModule::prepareToCreateButton() |
|
|
|
{ |
|
|
|
m_scene->setComponentTypeToCreate(ComponentType::Button); |
|
|
|
m_scene->setMode(CustomGraphicsScene::Mode::CreateItem); |
|
|
|
// 获取当前 TabWidget 中选中的 GraphicsView |
|
|
|
QTabWidget* tabWidget = ui_->tabWidget_2; |
|
|
|
QWidget* currentPage = tabWidget->currentWidget(); |
|
|
|
QGraphicsView* currentGraphicsView = currentPage->findChild<QGraphicsView*>(); |
|
|
|
CustomGraphicsScene* currentScene = qobject_cast<CustomGraphicsScene*>(currentGraphicsView->scene()); |
|
|
|
|
|
|
|
if (currentScene) { |
|
|
|
currentScene->setComponentTypeToCreate(ComponentType::Button); |
|
|
|
currentScene->setMode(CustomGraphicsScene::Mode::CreateItem); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
void HMIModule::prepareToCreateIndicator() |
|
|
|
{ |
|
|
|
m_scene->setComponentTypeToCreate(ComponentType::Indicator); |
|
|
|
m_scene->setMode(CustomGraphicsScene::Mode::CreateItem); |
|
|
|
// 获取当前 TabWidget 中选中的 GraphicsView |
|
|
|
QTabWidget* tabWidget = ui_->tabWidget_2; |
|
|
|
QWidget* currentPage = tabWidget->currentWidget(); |
|
|
|
QGraphicsView* currentGraphicsView = currentPage->findChild<QGraphicsView*>(); |
|
|
|
CustomGraphicsScene* currentScene = qobject_cast<CustomGraphicsScene*>(currentGraphicsView->scene()); |
|
|
|
|
|
|
|
if (currentScene) { |
|
|
|
currentScene->setComponentTypeToCreate(ComponentType::Indicator); |
|
|
|
currentScene->setMode(CustomGraphicsScene::Mode::CreateItem); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
void HMIModule::onComponentCreated(HmiComponent* item) |
|
|
@@ -82,7 +105,13 @@ void HMIModule::onComponentCreated(HmiComponent* item) |
|
|
|
|
|
|
|
void HMIModule::onCopyRequested() |
|
|
|
{ |
|
|
|
QList<QGraphicsItem*> selected = m_scene->selectedItems(); |
|
|
|
// 获取当前 TabWidget 中选中的 GraphicsView |
|
|
|
QTabWidget* tabWidget = ui_->tabWidget_2; |
|
|
|
QWidget* currentPage = tabWidget->currentWidget(); |
|
|
|
QGraphicsView* currentGraphicsView = currentPage->findChild<QGraphicsView*>(); |
|
|
|
CustomGraphicsScene* currentScene = qobject_cast<CustomGraphicsScene*>(currentGraphicsView->scene()); |
|
|
|
|
|
|
|
QList<QGraphicsItem*> selected = currentScene->selectedItems(); |
|
|
|
if (selected.isEmpty()) return; |
|
|
|
|
|
|
|
HmiComponent* itemToCopy = qgraphicsitem_cast<HmiComponent*>(selected.first()); |
|
|
@@ -105,6 +134,12 @@ void HMIModule::onPasteRequested(const QPointF& scenePos) |
|
|
|
{ |
|
|
|
if (!m_hasCopiedItem) return; |
|
|
|
|
|
|
|
// 获取当前 TabWidget 中选中的 GraphicsView |
|
|
|
QTabWidget* tabWidget = ui_->tabWidget_2; |
|
|
|
QWidget* currentPage = tabWidget->currentWidget(); |
|
|
|
QGraphicsView* currentGraphicsView = currentPage->findChild<QGraphicsView*>(); |
|
|
|
CustomGraphicsScene* currentScene = qobject_cast<CustomGraphicsScene*>(currentGraphicsView->scene()); |
|
|
|
|
|
|
|
HmiComponent* newItem = nullptr; |
|
|
|
if (m_copiedType == ComponentType::Button) { |
|
|
|
newItem = new HmiButton(); |
|
|
@@ -115,14 +150,20 @@ void HMIModule::onPasteRequested(const QPointF& scenePos) |
|
|
|
if (newItem) { |
|
|
|
newItem->setColor(m_copiedColor); |
|
|
|
newItem->setPos(scenePos); |
|
|
|
m_scene->addItem(newItem); |
|
|
|
currentScene->addItem(newItem); // 使用当前页面的 scene |
|
|
|
setupNewComponent(newItem); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
void HMIModule::onDeleteRequested() |
|
|
|
{ |
|
|
|
QList<QGraphicsItem*> selected = m_scene->selectedItems(); |
|
|
|
// 获取当前 TabWidget 中选中的 GraphicsView |
|
|
|
QTabWidget* tabWidget = ui_->tabWidget_2; |
|
|
|
QWidget* currentPage = tabWidget->currentWidget(); |
|
|
|
QGraphicsView* currentGraphicsView = currentPage->findChild<QGraphicsView*>(); |
|
|
|
CustomGraphicsScene* currentScene = qobject_cast<CustomGraphicsScene*>(currentGraphicsView->scene()); |
|
|
|
|
|
|
|
QList<QGraphicsItem*> selected = currentScene->selectedItems(); |
|
|
|
if (selected.isEmpty()) return; |
|
|
|
|
|
|
|
emit logMessageGenerated(QString("[%1] 删除 %2 个组件") |
|
|
@@ -131,31 +172,63 @@ void HMIModule::onDeleteRequested() |
|
|
|
|
|
|
|
for (int i = selected.count() - 1; i >= 0; --i) { |
|
|
|
QGraphicsItem* item = selected.at(i); |
|
|
|
m_scene->removeItem(item); |
|
|
|
currentScene->removeItem(item); // 使用当前页面的 scene |
|
|
|
delete item; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// 添加页面后的槽函数 |
|
|
|
void HMIModule::onPageAdded(int pageNumber, int index) |
|
|
|
{ |
|
|
|
if (index < m_pageOrder.size()) { |
|
|
|
m_pageOrder[index] = pageNumber; |
|
|
|
} else { |
|
|
|
m_pageOrder.append(pageNumber); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// 删除页面后的槽函数 |
|
|
|
void HMIModule::onPageRemoved(int pageNumber, int index) |
|
|
|
{ |
|
|
|
if (index < m_pageOrder.size()) { |
|
|
|
m_pageOrder[index] = -1; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// 确保提供 HMIModule::onComponentSelected 的定义 |
|
|
|
void HMIModule::onComponentSelected(HmiComponent* item) |
|
|
|
{ |
|
|
|
// 在这里添加你的代码 |
|
|
|
// 如果不需要任何操作,可以留空 |
|
|
|
} |
|
|
|
|
|
|
|
// 新增页面的槽函数 |
|
|
|
void HMIModule::addPage() |
|
|
|
{ |
|
|
|
QTabWidget* tabWidget = ui_->tabWidget_2; // 获取TabWidget |
|
|
|
QTabWidget* tabWidget = ui_->tabWidget_2; |
|
|
|
int pageNumber; |
|
|
|
int insertIndex = -1; |
|
|
|
|
|
|
|
// 检查是否有可用的页面编号 |
|
|
|
if (!m_availablePageNumbers.isEmpty()) { |
|
|
|
// 获取最小的可用的页面编号 (QList 已经是有序的) |
|
|
|
pageNumber = m_availablePageNumbers.first(); |
|
|
|
m_availablePageNumbers.removeFirst(); |
|
|
|
|
|
|
|
// 查找可用的插入位置 |
|
|
|
for (int i = 0; i < m_pageOrder.size(); ++i) { |
|
|
|
if (m_pageOrder[i] == -1) { |
|
|
|
insertIndex = i; |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
} else { |
|
|
|
// 如果没有可用的页面编号,则使用 m_pageCount 并递增 |
|
|
|
pageNumber = ++m_pageCount; |
|
|
|
} |
|
|
|
|
|
|
|
// 获取 Page 1 的 GraphicsView |
|
|
|
QGraphicsView* firstGraphicsView = ui_->hmiGraphicsView; |
|
|
|
CustomGraphicsScene* firstScene = m_scene; // 获取 Page 1 的 Scene |
|
|
|
|
|
|
|
// 创建新的页面部件 |
|
|
|
QWidget* newPage = new QWidget(tabWidget); |
|
|
|
QString pageName = QString("Page %1").arg(pageNumber); |
|
|
@@ -164,7 +237,17 @@ void HMIModule::addPage() |
|
|
|
// 创建新的 GraphicsView 和 Scene |
|
|
|
QGraphicsView* newGraphicsView = new QGraphicsView(newPage); |
|
|
|
CustomGraphicsScene* newScene = new CustomGraphicsScene(newGraphicsView, this); |
|
|
|
newScene->setSceneRect(0, 0, 800, 600); |
|
|
|
|
|
|
|
// 设置 GraphicsView 的大小,上下左右各扩大 10 像素 |
|
|
|
QSize newViewSize = firstGraphicsView->size(); |
|
|
|
newViewSize.setWidth(newViewSize.width() + 20); // 左右各增加 10 像素 |
|
|
|
newViewSize.setHeight(newViewSize.height() + 20); // 上下各增加 10 像素 |
|
|
|
newGraphicsView->resize(newViewSize); |
|
|
|
|
|
|
|
// 设置 GraphicsScene 的大小与 Page 1 相同 |
|
|
|
QRectF newSceneRect = firstScene->sceneRect(); |
|
|
|
newScene->setSceneRect(newSceneRect); |
|
|
|
|
|
|
|
newGraphicsView->setScene(newScene); |
|
|
|
|
|
|
|
// 布局 |
|
|
@@ -173,10 +256,27 @@ void HMIModule::addPage() |
|
|
|
newPage->setLayout(layout); |
|
|
|
|
|
|
|
// 添加到 TabWidget |
|
|
|
tabWidget->addTab(newPage, pageName); |
|
|
|
int tabIndex; |
|
|
|
if (insertIndex != -1) { |
|
|
|
tabIndex = insertIndex; |
|
|
|
tabWidget->insertTab(tabIndex, newPage, pageName); |
|
|
|
} else { |
|
|
|
tabIndex = tabWidget->addTab(newPage, pageName); |
|
|
|
} |
|
|
|
|
|
|
|
// 连接信号和槽 ******************************************************************* |
|
|
|
connect(newScene, &CustomGraphicsScene::componentCreated, this, &HMIModule::onComponentCreated); |
|
|
|
connect(newScene, &CustomGraphicsScene::copyRequestFromScene, this, &HMIModule::onCopyRequested); |
|
|
|
connect(newScene, &CustomGraphicsScene::pasteRequestFromScene, this, &HMIModule::onPasteRequested); |
|
|
|
connect(newScene, &CustomGraphicsScene::deleteRequestFromScene, this, &HMIModule::onDeleteRequested); |
|
|
|
// ***************************************************************************** |
|
|
|
|
|
|
|
// 发送 pageAdded 信号 |
|
|
|
emit pageAdded(pageNumber, tabIndex); |
|
|
|
|
|
|
|
tabWidget->setCurrentWidget(newPage); |
|
|
|
|
|
|
|
//记录日志 |
|
|
|
// 记录日志 |
|
|
|
emit logMessageGenerated(QString("[%1] 添加页面: %2").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss")).arg(pageName)); |
|
|
|
} |
|
|
|
|
|
|
@@ -199,7 +299,7 @@ void HMIModule::deletePage() |
|
|
|
// 从页面名称中提取页面编号 |
|
|
|
int pageNumber = pageName.remove("Page ").toInt(); |
|
|
|
|
|
|
|
// 将删除的页面编号添加到可用列表中,并保持列表有序 |
|
|
|
// 将删除的页面编号添加到可用列表中 |
|
|
|
m_availablePageNumbers.append(pageNumber); |
|
|
|
std::sort(m_availablePageNumbers.begin(), m_availablePageNumbers.end()); |
|
|
|
|
|
|
@@ -209,6 +309,9 @@ void HMIModule::deletePage() |
|
|
|
// 删除页面 |
|
|
|
delete currentPage; |
|
|
|
|
|
|
|
// 发送 pageRemoved 信号 |
|
|
|
emit pageRemoved(pageNumber, currentIndex); |
|
|
|
|
|
|
|
// 记录日志 |
|
|
|
emit logMessageGenerated(QString("[%1] 删除页面: %2").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss")).arg(pageName)); |
|
|
|
} |
|
|
|