Bläddra i källkod

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

master
付春阳 2 dagar sedan
förälder
incheckning
be99eca5e8
4 ändrade filer med 133 tillägg och 30 borttagningar
  1. +0
    -5
      customgraphics.cpp
  2. +0
    -4
      customgraphicsscene.cpp
  3. +120
    -17
      hmimodule.cpp
  4. +13
    -4
      hmimodule.h

+ 0
- 5
customgraphics.cpp Visa fil

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


// HmiComponent 基类实现 // HmiComponent 基类实现

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


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



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


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


+ 0
- 4
customgraphicsscene.cpp Visa fil

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


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


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


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




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


+ 120
- 17
hmimodule.cpp Visa fil

@@ -5,11 +5,14 @@
#include <QTabWidget> #include <QTabWidget>
#include <QMessageBox> #include <QMessageBox>
#include <QVBoxLayout> #include <QVBoxLayout>
#include <algorithm> // 引入 std::sort
#include <algorithm>


HMIModule::HMIModule(Ui::MainWindow* ui, QObject *parent) HMIModule::HMIModule(Ui::MainWindow* ui, QObject *parent)
: QObject{parent}, ui_(ui), m_scene(nullptr) : QObject{parent}, ui_(ui), m_scene(nullptr)
{}
{
// 初始化 m_pageOrder
m_pageOrder.append(1); // 初始页面
}


void HMIModule::setButtonIcon(QAbstractButton *button, const QString &iconPath) 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_->deletePage, &QPushButton::clicked, this, &HMIModule::deletePage);
connect(ui_->prePage, &QPushButton::clicked, this, &HMIModule::prePage); connect(ui_->prePage, &QPushButton::clicked, this, &HMIModule::prePage);
connect(ui_->nextPage, &QPushButton::clicked, this, &HMIModule::nextPage); 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) void HMIModule::setupNewComponent(HmiComponent* item)
@@ -65,14 +72,30 @@ void HMIModule::setupNewComponent(HmiComponent* item)


void HMIModule::prepareToCreateButton() 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() 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) void HMIModule::onComponentCreated(HmiComponent* item)
@@ -82,7 +105,13 @@ void HMIModule::onComponentCreated(HmiComponent* item)


void HMIModule::onCopyRequested() 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; if (selected.isEmpty()) return;


HmiComponent* itemToCopy = qgraphicsitem_cast<HmiComponent*>(selected.first()); HmiComponent* itemToCopy = qgraphicsitem_cast<HmiComponent*>(selected.first());
@@ -105,6 +134,12 @@ void HMIModule::onPasteRequested(const QPointF& scenePos)
{ {
if (!m_hasCopiedItem) return; 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; HmiComponent* newItem = nullptr;
if (m_copiedType == ComponentType::Button) { if (m_copiedType == ComponentType::Button) {
newItem = new HmiButton(); newItem = new HmiButton();
@@ -115,14 +150,20 @@ void HMIModule::onPasteRequested(const QPointF& scenePos)
if (newItem) { if (newItem) {
newItem->setColor(m_copiedColor); newItem->setColor(m_copiedColor);
newItem->setPos(scenePos); newItem->setPos(scenePos);
m_scene->addItem(newItem);
currentScene->addItem(newItem); // 使用当前页面的 scene
setupNewComponent(newItem); setupNewComponent(newItem);
} }
} }


void HMIModule::onDeleteRequested() 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; if (selected.isEmpty()) return;


emit logMessageGenerated(QString("[%1] 删除 %2 个组件") emit logMessageGenerated(QString("[%1] 删除 %2 个组件")
@@ -131,31 +172,63 @@ void HMIModule::onDeleteRequested()


for (int i = selected.count() - 1; i >= 0; --i) { for (int i = selected.count() - 1; i >= 0; --i) {
QGraphicsItem* item = selected.at(i); QGraphicsItem* item = selected.at(i);
m_scene->removeItem(item);
currentScene->removeItem(item); // 使用当前页面的 scene
delete item; 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::onComponentSelected(HmiComponent* item)
{ {
// 在这里添加你的代码
// 如果不需要任何操作,可以留空
} }


// 新增页面的槽函数 // 新增页面的槽函数
void HMIModule::addPage() void HMIModule::addPage()
{ {
QTabWidget* tabWidget = ui_->tabWidget_2; // 获取TabWidget
QTabWidget* tabWidget = ui_->tabWidget_2;
int pageNumber; int pageNumber;
int insertIndex = -1;


// 检查是否有可用的页面编号 // 检查是否有可用的页面编号
if (!m_availablePageNumbers.isEmpty()) { if (!m_availablePageNumbers.isEmpty()) {
// 获取最小的可用的页面编号 (QList 已经是有序的)
pageNumber = m_availablePageNumbers.first(); pageNumber = m_availablePageNumbers.first();
m_availablePageNumbers.removeFirst(); m_availablePageNumbers.removeFirst();

// 查找可用的插入位置
for (int i = 0; i < m_pageOrder.size(); ++i) {
if (m_pageOrder[i] == -1) {
insertIndex = i;
break;
}
}
} else { } else {
// 如果没有可用的页面编号,则使用 m_pageCount 并递增
pageNumber = ++m_pageCount; pageNumber = ++m_pageCount;
} }


// 获取 Page 1 的 GraphicsView
QGraphicsView* firstGraphicsView = ui_->hmiGraphicsView;
CustomGraphicsScene* firstScene = m_scene; // 获取 Page 1 的 Scene

// 创建新的页面部件 // 创建新的页面部件
QWidget* newPage = new QWidget(tabWidget); QWidget* newPage = new QWidget(tabWidget);
QString pageName = QString("Page %1").arg(pageNumber); QString pageName = QString("Page %1").arg(pageNumber);
@@ -164,7 +237,17 @@ void HMIModule::addPage()
// 创建新的 GraphicsView 和 Scene // 创建新的 GraphicsView 和 Scene
QGraphicsView* newGraphicsView = new QGraphicsView(newPage); QGraphicsView* newGraphicsView = new QGraphicsView(newPage);
CustomGraphicsScene* newScene = new CustomGraphicsScene(newGraphicsView, this); 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); newGraphicsView->setScene(newScene);


// 布局 // 布局
@@ -173,10 +256,27 @@ void HMIModule::addPage()
newPage->setLayout(layout); newPage->setLayout(layout);


// 添加到 TabWidget // 添加到 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); tabWidget->setCurrentWidget(newPage);


//记录日志
// 记录日志
emit logMessageGenerated(QString("[%1] 添加页面: %2").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss")).arg(pageName)); 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(); int pageNumber = pageName.remove("Page ").toInt();


// 将删除的页面编号添加到可用列表中,并保持列表有序
// 将删除的页面编号添加到可用列表中
m_availablePageNumbers.append(pageNumber); m_availablePageNumbers.append(pageNumber);
std::sort(m_availablePageNumbers.begin(), m_availablePageNumbers.end()); std::sort(m_availablePageNumbers.begin(), m_availablePageNumbers.end());


@@ -209,6 +309,9 @@ void HMIModule::deletePage()
// 删除页面 // 删除页面
delete currentPage; delete currentPage;


// 发送 pageRemoved 信号
emit pageRemoved(pageNumber, currentIndex);

// 记录日志 // 记录日志
emit logMessageGenerated(QString("[%1] 删除页面: %2").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss")).arg(pageName)); emit logMessageGenerated(QString("[%1] 删除页面: %2").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss")).arg(pageName));
} }


+ 13
- 4
hmimodule.h Visa fil

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


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


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

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


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


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


#endif // HMIMODULE_H #endif // HMIMODULE_H

Laddar…
Avbryt
Spara