@@ -1,6 +1,6 @@ | |||||
<?xml version="1.0" encoding="UTF-8"?> | <?xml version="1.0" encoding="UTF-8"?> | ||||
<!DOCTYPE QtCreatorProject> | <!DOCTYPE QtCreatorProject> | ||||
<!-- Written by QtCreator 4.11.1, 2025-08-05T09:23:15. --> | |||||
<!-- Written by QtCreator 4.11.1, 2025-08-05T21:07:14. --> | |||||
<qtcreator> | <qtcreator> | ||||
<data> | <data> | ||||
<variable>EnvironmentId</variable> | <variable>EnvironmentId</variable> | ||||
@@ -287,19 +287,19 @@ | |||||
</valuelist> | </valuelist> | ||||
<value type="int" key="PE.EnvironmentAspect.Base">2</value> | <value type="int" key="PE.EnvironmentAspect.Base">2</value> | ||||
<valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/> | <valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/> | ||||
<value type="QString" key="ProjectExplorer.CustomExecutableRunConfiguration.Executable"></value> | |||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.CustomExecutableRunConfiguration</value> | |||||
<value type="QString" key="ProjectExplorer.RunConfiguration.BuildKey"></value> | |||||
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4RunConfiguration:C:/Users/admin/Desktop/two/IntegratedPlatform/IntegratedPlatform.pro</value> | |||||
<value type="QString" key="ProjectExplorer.RunConfiguration.BuildKey">C:/Users/admin/Desktop/two/IntegratedPlatform/IntegratedPlatform.pro</value> | |||||
<value type="QString" key="RunConfiguration.Arguments"></value> | <value type="QString" key="RunConfiguration.Arguments"></value> | ||||
<value type="bool" key="RunConfiguration.Arguments.multi">false</value> | <value type="bool" key="RunConfiguration.Arguments.multi">false</value> | ||||
<value type="QString" key="RunConfiguration.OverrideDebuggerStartup"></value> | <value type="QString" key="RunConfiguration.OverrideDebuggerStartup"></value> | ||||
<value type="bool" key="RunConfiguration.UseCppDebugger">false</value> | <value type="bool" key="RunConfiguration.UseCppDebugger">false</value> | ||||
<value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value> | <value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value> | ||||
<value type="bool" key="RunConfiguration.UseLibrarySearchPath">true</value> | |||||
<value type="bool" key="RunConfiguration.UseMultiProcess">false</value> | <value type="bool" key="RunConfiguration.UseMultiProcess">false</value> | ||||
<value type="bool" key="RunConfiguration.UseQmlDebugger">false</value> | <value type="bool" key="RunConfiguration.UseQmlDebugger">false</value> | ||||
<value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value> | <value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value> | ||||
<value type="QString" key="RunConfiguration.WorkingDirectory"></value> | <value type="QString" key="RunConfiguration.WorkingDirectory"></value> | ||||
<value type="QString" key="RunConfiguration.WorkingDirectory.default"></value> | |||||
<value type="QString" key="RunConfiguration.WorkingDirectory.default">C:/Users/admin/Desktop/build-IntegratedPlatform-Desktop_Qt_5_14_2_MinGW_32_bit-Debug</value> | |||||
</valuemap> | </valuemap> | ||||
<value type="int" key="ProjectExplorer.Target.RunConfigurationCount">1</value> | <value type="int" key="ProjectExplorer.Target.RunConfigurationCount">1</value> | ||||
</valuemap> | </valuemap> | ||||
@@ -0,0 +1,90 @@ | |||||
#include "hmiwidget.h" | |||||
#include <QGraphicsSceneMouseEvent> | |||||
#include <QCursor> | |||||
ResizableRectangle::ResizableRectangle(qreal x, qreal y, qreal w, qreal h) | |||||
: QGraphicsRectItem(x, y, w, h), resizing(false) | |||||
{ | |||||
setFlag(QGraphicsItem::ItemIsMovable, true); | |||||
setFlag(QGraphicsItem::ItemIsSelectable, true); | |||||
setCursor(Qt::ArrowCursor); | |||||
} | |||||
void ResizableRectangle::mousePressEvent(QGraphicsSceneMouseEvent *event) | |||||
{ | |||||
// 检查是否在调整区域 | |||||
if (rect().bottomRight().x() - 10 <= event->pos().x() && | |||||
rect().bottomRight().y() - 10 <= event->pos().y()) { | |||||
resizing = true; | |||||
setCursor(Qt::SizeFDiagCursor); | |||||
} else { | |||||
// 传递事件给基类处理移动 | |||||
resizing = false; | |||||
setCursor(Qt::SizeAllCursor); | |||||
QGraphicsRectItem::mousePressEvent(event); | |||||
} | |||||
} | |||||
void ResizableRectangle::mouseMoveEvent(QGraphicsSceneMouseEvent *event) | |||||
{ | |||||
if (resizing) { | |||||
// 调整大小逻辑 | |||||
QRectF newRect = rect(); | |||||
newRect.setBottomRight(event->pos()); | |||||
setRect(newRect); | |||||
} else { | |||||
// 传递事件给基类处理移动 | |||||
QGraphicsRectItem::mouseMoveEvent(event); | |||||
} | |||||
} | |||||
void ResizableRectangle::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) | |||||
{ | |||||
resizing = false; | |||||
setCursor(Qt::ArrowCursor); | |||||
QGraphicsRectItem::mouseReleaseEvent(event); | |||||
} | |||||
// -------------------- ResizableEllipse -------------------- | |||||
ResizableEllipse::ResizableEllipse(qreal x, qreal y, qreal w, qreal h) | |||||
: QGraphicsEllipseItem(x, y, w, h), resizing2(false) | |||||
{ | |||||
setFlag(QGraphicsItem::ItemIsMovable, true); | |||||
setFlag(QGraphicsItem::ItemIsSelectable, true); | |||||
setCursor(Qt::ArrowCursor); | |||||
} | |||||
void ResizableEllipse::mousePressEvent(QGraphicsSceneMouseEvent *event) | |||||
{ | |||||
QRectF ellipseRect = rect(); | |||||
if (ellipseRect.bottomRight().x() - 10 <= event->pos().x() && | |||||
ellipseRect.bottomRight().y() - 10 <= event->pos().y()) { | |||||
resizing2 = true; | |||||
setCursor(Qt::SizeFDiagCursor); | |||||
} else { | |||||
// 传递事件给基类处理移动 | |||||
resizing2 = false; | |||||
setCursor(Qt::SizeAllCursor); | |||||
QGraphicsEllipseItem::mousePressEvent(event); | |||||
} | |||||
} | |||||
void ResizableEllipse::mouseMoveEvent(QGraphicsSceneMouseEvent *event) | |||||
{ | |||||
if (resizing2) { | |||||
QRectF newRect = rect(); | |||||
newRect.setBottomRight(event->pos()); | |||||
setRect(newRect); | |||||
} else { | |||||
// 传递事件给基类处理移动 | |||||
QGraphicsEllipseItem::mouseMoveEvent(event); | |||||
} | |||||
} | |||||
void ResizableEllipse::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) | |||||
{ | |||||
resizing2 = false; | |||||
setCursor(Qt::ArrowCursor); | |||||
QGraphicsEllipseItem::mouseReleaseEvent(event); | |||||
} |
@@ -1,4 +1,50 @@ | |||||
#ifndef HMIELEMENT_H | #ifndef HMIELEMENT_H | ||||
#define HMIELEMENT_H | #define HMIELEMENT_H | ||||
#include <QGraphicsRectItem> | |||||
#include <QGraphicsEllipseItem> | |||||
#include <QGraphicsSceneMouseEvent> | |||||
#include <QPen> | |||||
#include <QBrush> | |||||
// 自定义矩形类,支持大小调整 | |||||
class ResizableRectangle : public QGraphicsRectItem | |||||
{ | |||||
public: | |||||
// 构造函数 | |||||
ResizableRectangle(qreal x, qreal y, qreal w, qreal h); | |||||
protected: | |||||
// 鼠标按下事件 | |||||
void mousePressEvent(QGraphicsSceneMouseEvent *event) override; | |||||
// 鼠标移动事件 | |||||
void mouseMoveEvent(QGraphicsSceneMouseEvent *event) override; | |||||
// 鼠标释放事件 | |||||
void mouseReleaseEvent(QGraphicsSceneMouseEvent *event) override; | |||||
private: | |||||
bool resizing; //是否正在调整大小 | |||||
}; | |||||
// 自定义圆形类,支持大小调整 | |||||
class ResizableEllipse : public QGraphicsEllipseItem | |||||
{ | |||||
public: | |||||
// 构造函数 | |||||
ResizableEllipse(qreal x, qreal y, qreal w, qreal h); | |||||
protected: | |||||
// 鼠标按下事件 | |||||
void mousePressEvent(QGraphicsSceneMouseEvent *event) override; | |||||
// 鼠标移动事件 | |||||
void mouseMoveEvent(QGraphicsSceneMouseEvent *event) override; | |||||
// 鼠标释放事件 | |||||
void mouseReleaseEvent(QGraphicsSceneMouseEvent *event) override; | |||||
private: | |||||
bool resizing2; // 是否正在调整大小 | |||||
}; | |||||
#endif // HMIELEMENT_H | #endif // HMIELEMENT_H |
@@ -1,5 +1,6 @@ | |||||
#include "mainwindow.h" | #include "mainwindow.h" | ||||
#include "ui_mainwindow.h" | #include "ui_mainwindow.h" | ||||
#include"hmiwidget.h" | |||||
MainWindow::MainWindow(QWidget *parent) | MainWindow::MainWindow(QWidget *parent) | ||||
: QMainWindow(parent) | : QMainWindow(parent) | ||||
@@ -10,14 +11,13 @@ MainWindow::MainWindow(QWidget *parent) | |||||
ui->setupUi(this); | ui->setupUi(this); | ||||
scene = new QGraphicsScene(this); | scene = new QGraphicsScene(this); | ||||
ui->graphicsView_2->setScene(scene); | ui->graphicsView_2->setScene(scene); | ||||
connect(ui->treeWidget_2, &QTreeWidget::itemClicked, this, &MainWindow::onHmiItemClicked); | connect(ui->treeWidget_2, &QTreeWidget::itemClicked, this, &MainWindow::onHmiItemClicked); | ||||
ui-> graphicsView_2->viewport()->installEventFilter(this); | ui-> graphicsView_2->viewport()->installEventFilter(this); | ||||
addDockWidget(Qt::BottomDockWidgetArea, ui->dockWidget_3);//将dockWidget_3添加到主窗口的下方 | |||||
QList<QTreeWidgetItem *> items = ui->treeWidget_2->findItems("指示灯", Qt::MatchExactly); | |||||
for (QTreeWidgetItem *item : items) { | |||||
item->setIcon(0, QIcon("C:/Users/admin/Desktop/T-常开触点-01.png")); | |||||
} | |||||
addDockWidget(Qt::BottomDockWidgetArea, ui->dockWidget_3);//将dockWidget_3添加到主窗口的下方 | |||||
ui->treeWidget_2->topLevelItem(0)->setIcon(0, QIcon("C:/Users/admin/Desktop/灯泡.png")); | |||||
ui->treeWidget_2->topLevelItem(1)->setIcon(0, QIcon("C:/Users/admin/Desktop/按钮.png")); | |||||
} | } | ||||
MainWindow::~MainWindow() | MainWindow::~MainWindow() | ||||
@@ -25,7 +25,8 @@ MainWindow::~MainWindow() | |||||
delete ui; | delete ui; | ||||
} | } | ||||
void MainWindow::onHmiItemClicked(QTreeWidgetItem *item){ | |||||
void MainWindow::onHmiItemClicked(QTreeWidgetItem *item) | |||||
{ | |||||
if (item->text(0) == "指示灯") | if (item->text(0) == "指示灯") | ||||
{ | { | ||||
canDrawCircle = true; | canDrawCircle = true; | ||||
@@ -43,29 +44,43 @@ void MainWindow::onHmiItemClicked(QTreeWidgetItem *item){ | |||||
} | } | ||||
bool MainWindow::eventFilter(QObject *obj, QEvent *event) | bool MainWindow::eventFilter(QObject *obj, QEvent *event) | ||||
{ | { | ||||
if (obj == ui->graphicsView_2->viewport() && event->type() == QEvent::MouseButtonPress) { | |||||
// 修正1:使用一致的视图对象名(graphicsView_2) | |||||
if (obj != ui->graphicsView_2->viewport()) { | |||||
return false; // 不是我们关心的对象,不处理 | |||||
} | |||||
// 只处理鼠标按下事件 | |||||
if (event->type() == QEvent::MouseButtonPress) { | |||||
QMouseEvent *mouseEvent = static_cast<QMouseEvent *>(event); | QMouseEvent *mouseEvent = static_cast<QMouseEvent *>(event); | ||||
if (mouseEvent->button() == Qt::LeftButton) { | if (mouseEvent->button() == Qt::LeftButton) { | ||||
// 获取点击的场景坐标 | // 获取点击的场景坐标 | ||||
if (canDrawCircle) | |||||
{ | |||||
QPointF scenePos = ui->graphicsView_2->mapToScene(mouseEvent->pos());// 在点击位置绘制一个指示灯 | |||||
scene->addEllipse(scenePos.x(), scenePos.y(), 50, 50, QPen(Qt::black), QBrush(Qt::blue)); | |||||
} | |||||
else if (canDrawRectangle) | |||||
{ | |||||
QPointF scenePos = ui->graphicsView_2->mapToScene(mouseEvent->pos());//在点击位置绘制一个按钮 | |||||
scene->addRect(scenePos.x(), scenePos.y(), 50, 50, QPen(Qt::black), QBrush(Qt::blue)); | |||||
QPointF scenePos = ui->graphicsView_2->mapToScene(mouseEvent->pos()); | |||||
// 根据标志绘制元素 | |||||
if (canDrawCircle) { | |||||
ResizableEllipse *circle = new ResizableEllipse( | |||||
scenePos.x(), scenePos.y(), 50, 50); | |||||
circle->setBrush(QBrush(Qt::red)); // 设置指示灯颜色 | |||||
scene->addItem(circle); | |||||
} | } | ||||
QTreeWidgetItem *selectedItem = ui->treeWidget_2->currentItem(); | |||||
if (selectedItem) | |||||
{ | |||||
selectedItem->setSelected(false);//取消选中当前项目 | |||||
else if (canDrawRectangle) { | |||||
ResizableRectangle *rectangle = new ResizableRectangle( | |||||
scenePos.x(), scenePos.y(), 100, 50); | |||||
rectangle->setBrush(QBrush(Qt::yellow)); // 设置按钮颜色 | |||||
scene->addItem(rectangle); | |||||
} | } | ||||
// 重置绘制标志 | |||||
canDrawCircle = false; | canDrawCircle = false; | ||||
canDrawRectangle = false; | canDrawRectangle = false; | ||||
return true; | |||||
// 修正2:使用一致的树控件对象名(treeWidget_2) | |||||
if (ui->treeWidget_2->currentItem()) { | |||||
ui->treeWidget_2->currentItem()->setSelected(false); | |||||
} | |||||
return true; // 事件已处理 | |||||
} | } | ||||
return QMainWindow::eventFilter(obj, event); | |||||
} | } | ||||
// 修正3:正确处理未过滤的事件 | |||||
return QMainWindow::eventFilter(obj, event); | |||||
} | } |
@@ -52,7 +52,7 @@ | |||||
<property name="font"> | <property name="font"> | ||||
<font> | <font> | ||||
<family>宋体</family> | <family>宋体</family> | ||||
<pointsize>12</pointsize> | |||||
<pointsize>16</pointsize> | |||||
</font> | </font> | ||||
</property> | </property> | ||||
<column> | <column> | ||||
@@ -110,7 +110,7 @@ | |||||
<property name="font"> | <property name="font"> | ||||
<font> | <font> | ||||
<family>宋体</family> | <family>宋体</family> | ||||
<pointsize>18</pointsize> | |||||
<pointsize>16</pointsize> | |||||
</font> | </font> | ||||
</property> | </property> | ||||
<property name="selectionMode"> | <property name="selectionMode"> | ||||