Browse Source

新增删除切换页面完善,能够在新增的页面中新增元素了

master
付春阳 1 day ago
parent
commit
be99eca5e8
4 changed files with 133 additions and 30 deletions
  1. +0
    -5
      customgraphics.cpp
  2. +0
    -4
      customgraphicsscene.cpp
  3. +120
    -17
      hmimodule.cpp
  4. +13
    -4
      hmimodule.h

+ 0
- 5
customgraphics.cpp View File

@@ -5,7 +5,6 @@
#include <QGraphicsScene>

// HmiComponent 基类实现

HmiComponent::HmiComponent(QGraphicsItem *parent) : QGraphicsObject(parent)
{
setFlag(QGraphicsItem::ItemIsMovable, true);
@@ -56,7 +55,6 @@ void HmiComponent::mousePressEvent(QGraphicsSceneMouseEvent *event)
QGraphicsObject::mousePressEvent(event);
}

// 实现 contextMenuEvent
void HmiComponent::contextMenuEvent(QGraphicsSceneContextMenuEvent *event)
{
// 右键点击时,先清空场景中的其他选中项,然后选中当前项
@@ -80,8 +78,6 @@ void HmiComponent::contextMenuEvent(QGraphicsSceneContextMenuEvent *event)
menu.exec(event->screenPos());
}


// HmiButton 类实现
HmiButton::HmiButton(QGraphicsItem *parent) : HmiComponent(parent)
{
m_color = Qt::gray;
@@ -100,7 +96,6 @@ void HmiButton::paintShape(QPainter *painter)
painter->drawRect(boundingRect());
}

// HmiIndicator 类实现
HmiIndicator::HmiIndicator(QGraphicsItem *parent) : HmiComponent(parent)
{
m_color = Qt::green;


+ 0
- 4
customgraphicsscene.cpp View File

@@ -27,13 +27,11 @@ void CustomGraphicsScene::setMode(Mode mode)
}
}

// setComponentTypeToCreate 函数无需改动
void CustomGraphicsScene::setComponentTypeToCreate(ComponentType type)
{
m_componentTypeToCreate = type;
}

// mousePressEvent 函数无需改动
void CustomGraphicsScene::mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent)
{
if (mouseEvent->button() != Qt::LeftButton) {
@@ -76,14 +74,12 @@ void CustomGraphicsScene::mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent)
}
}

// mouseMoveEvent 函数无需改动
void CustomGraphicsScene::mouseMoveEvent(QGraphicsSceneMouseEvent *mouseEvent)
{
QGraphicsScene::mouseMoveEvent(mouseEvent);
}


// 修改或新增 keyPressEvent
void CustomGraphicsScene::keyPressEvent(QKeyEvent *keyEvent)
{
// 退出创建模式


+ 120
- 17
hmimodule.cpp View File

@@ -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));
}


+ 13
- 4
hmimodule.h View File

@@ -4,7 +4,9 @@
#include <QObject>
#include "ui_MainWindow.h"
#include "customgraphicsscene.h"
#include <QList> // 引入 QList
#include <QList>
#include <QMap>
#include <QVector>

class HMIModule : public QObject
{
@@ -14,6 +16,11 @@ public:
void setButtonIcon(QAbstractButton* button, const QString& iconPath);
void init();

signals:
void pageAdded(int pageNumber, int index);
void pageRemoved(int pageNumber, int index);
void logMessageGenerated(const QString& message); // 确保此行存在

private slots:
void prepareToCreateButton();
void prepareToCreateIndicator();
@@ -29,8 +36,9 @@ private slots:
void prePage();
void nextPage();

signals:
void logMessageGenerated(const QString& message);
// 新增的槽函数
void onPageAdded(int pageNumber, int index);
void onPageRemoved(int pageNumber, int index);

private:
void setupNewComponent(HmiComponent* item);
@@ -42,7 +50,8 @@ private:
QColor m_copiedColor;
bool m_hasCopiedItem = false;
int m_pageCount = 1; // 初始化页面计数器
QList<int> m_availablePageNumbers; // 用于存储可用的页面编号 (有序列表)
QList<int> m_availablePageNumbers; // 存储可用的页面编号 (有序列表)
QList<int> m_pageOrder; // 维护页面顺序
};

#endif // HMIMODULE_H

Loading…
Cancel
Save