Skip to content

Commit 550efcf

Browse files
committed
[重构图形项鼠标事件处理并优化字幕分割线功能]:统一了各图形项的鼠标事件处理机制,新增专用字幕分割线组件,并优化了边缘检测算法
-**图形项鼠标事件重构**: 将原有各图形项(圆弧、圆、线、多边形、圆环、旋转矩形、圆角矩形)中的鼠标移动和悬停事件处理逻辑统一抽象到基类`GraphicsBasicItem`中,通过新增`handleMouseMoveEvent`、`detectEdgeRegion`和`updateHoverPreview`等虚函数实现差异化处理,提高代码复用性和可维护性 -**新增字幕分割线组件**: 删除原有`CustomLineItem`类,新增`SubtitleDividerLineItem`专用组件,重写鼠标移动事件处理逻辑,确保分割线仅支持垂直方向移动,优化字幕拼接界面交互体验 -**图形项边缘检测优化**: 在各图形项中实现`detectEdgeRegion`方法,改进边缘区域检测算法,使用`Utils::isPointNearEdge`方法替代原有粗略计算,提升边缘拖拽操作的精准度 -**示例代码同步更新**: 同步更新示例代码中相关组件引用,将`SectionalSubtitlesView`中的分割线组件替换为新的`SubtitleDividerLineItem`,并修复分割线位置计算逻辑 -**图形工具函数增强**: 在`graphicsutils`中新增`isPointNearEdge`和`pointAtDistance`工具函数,提供更精确的点到边缘距离计算和坐标点定位功能 -**视图初始化优化**: 提取`GraphicsView`初始化逻辑到独立方法`initializeView`中,改善代码结构清晰度 -**条件判断简化**: 在`subtitlsplicingwidget.cc`中简化信号处理函数的条件判断逻辑,提升代码可读性 -**Lambda表达式安全优化**: 在`listiitemview.cc`中修正lambda表达式捕获方式,避免潜在的空指针访问问题
1 parent 3703172 commit 550efcf

31 files changed

Lines changed: 837 additions & 870 deletions

examples/graphics/CMakeLists.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,6 @@ set(PROJECT_SOURCES
99
../common/viewer.hpp
1010
capturewidget.cc
1111
capturewidget.hpp
12-
customlineitem.cc
13-
customlineitem.hpp
1412
drawscene.cc
1513
drawscene.hpp
1614
drawwidget.cpp
@@ -46,6 +44,8 @@ set(PROJECT_SOURCES
4644
sizeselectorwidget.hpp
4745
stretchparamssettingdailog.cc
4846
stretchparamssettingdailog.hpp
47+
subtitledividerlineitem.cc
48+
subtitledividerlineitem.hpp
4949
subtitlsplicingwidget.cc
5050
subtitlsplicingwidget.hpp)
5151

examples/graphics/customlineitem.cc

Lines changed: 0 additions & 26 deletions
This file was deleted.

examples/graphics/customlineitem.hpp

Lines changed: 0 additions & 12 deletions
This file was deleted.

examples/graphics/graphics.pro

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ SOURCES += \
2323
../common/thumbnail.cc \
2424
../common/imagelistmodel.cpp \
2525
capturewidget.cc \
26-
customlineitem.cc \
2726
drawscene.cc \
2827
drawwidget.cpp \
2928
icoconverterwidget.cc \
@@ -42,6 +41,7 @@ SOURCES += \
4241
selectionwidget.cc \
4342
sizeselectorwidget.cc \
4443
stretchparamssettingdailog.cc \
44+
subtitledividerlineitem.cc \
4545
subtitlsplicingwidget.cc
4646

4747
HEADERS += \
@@ -50,7 +50,6 @@ HEADERS += \
5050
../common/thumbnail.hpp \
5151
../common/imagelistmodel.h \
5252
capturewidget.hpp \
53-
customlineitem.hpp \
5453
drawscene.hpp \
5554
drawwidget.h \
5655
icoconverterwidget.hpp \
@@ -68,6 +67,7 @@ HEADERS += \
6867
selectionwidget.hpp \
6968
sizeselectorwidget.hpp \
7069
stretchparamssettingdailog.hpp \
70+
subtitledividerlineitem.hpp \
7171
subtitlsplicingwidget.hpp
7272

7373
win32 {

examples/graphics/listiitemview.cc

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,10 @@ class LoadImageTask : public QRunnable
2222
auto widgetSize = m_viewPtr->size();
2323
auto imageSize = image.size();
2424
image = image.scaled(widgetSize, Qt::KeepAspectRatio /*, Qt::SmoothTransformation*/);
25+
auto view = m_viewPtr.data();
2526
QMetaObject::invokeMethod(
26-
m_viewPtr.data(),
27-
[this, image, imageSize] { m_viewPtr->setImage(image, imageSize); },
27+
view,
28+
[view, image, imageSize] { view->setImage(image, imageSize); },
2829
Qt::QueuedConnection);
2930
}
3031

examples/graphics/sectionalsubtitlesview.cc

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
#include "sectionalsubtitlesview.hpp"
2-
#include "customlineitem.hpp"
2+
#include "subtitledividerlineitem.hpp"
33

44
#include <QtWidgets>
55

@@ -8,14 +8,14 @@ class SectionalSubtitlesView::SectionalSubtitlesViewPrivate
88
public:
99
SectionalSubtitlesViewPrivate(QWidget *parent)
1010
: q_ptr(parent)
11-
, line1Ptr(new CustomLineItem)
12-
, line2Ptr(new CustomLineItem)
11+
, line1Ptr(new SubtitleDividerLineItem)
12+
, line2Ptr(new SubtitleDividerLineItem)
1313
{}
1414
~SectionalSubtitlesViewPrivate() {}
1515

1616
QWidget *q_ptr;
17-
QScopedPointer<CustomLineItem> line1Ptr;
18-
QScopedPointer<CustomLineItem> line2Ptr;
17+
SubtitleDividerLineItemPtr line1Ptr;
18+
SubtitleDividerLineItemPtr line2Ptr;
1919
};
2020

2121
SectionalSubtitlesView::SectionalSubtitlesView(QWidget *parent)
@@ -31,10 +31,10 @@ void SectionalSubtitlesView::setImageAfter()
3131
{
3232
auto rect = sceneRect();
3333
auto y = rect.height() / 5.0 * 4;
34-
d_ptr->line1Ptr->setLine(QLineF(1, y, rect.width() - 1, y));
35-
d_ptr->line2Ptr->setLine(QLineF(1, rect.height() - 2, rect.width() - 1, rect.height() - 2));
3634
scene()->addItem(d_ptr->line1Ptr.data());
3735
scene()->addItem(d_ptr->line2Ptr.data());
36+
d_ptr->line1Ptr->setLine(QLineF(1, y, rect.width() - 1, y));
37+
d_ptr->line2Ptr->setLine(QLineF(1, rect.height() - 1, rect.width() - 1, rect.height() - 1));
3838
}
3939

4040
auto SectionalSubtitlesView::clipImage() const -> QImage
@@ -64,7 +64,7 @@ auto SectionalSubtitlesView::info() const -> StitchingImageInfo
6464

6565
auto SectionalSubtitlesView::line1RatioOfHeight() const -> double
6666
{
67-
return (d_ptr->line1Ptr->line().y1() / pixmap().size().height());
67+
return (static_cast<int>(d_ptr->line1Ptr->line().y1()) * 1.0 / pixmap().size().height());
6868
}
6969

7070
void SectionalSubtitlesView::setLine1RatioOfHeight(double value)
@@ -76,7 +76,7 @@ void SectionalSubtitlesView::setLine1RatioOfHeight(double value)
7676

7777
auto SectionalSubtitlesView::line2RatioOfHeight() const -> double
7878
{
79-
return (d_ptr->line2Ptr->line().y1() / pixmap().size().height());
79+
return (static_cast<int>(d_ptr->line2Ptr->line().y1()) * 1.0 / pixmap().size().height());
8080
}
8181

8282
void SectionalSubtitlesView::setLine2RatioOfHeight(double value)
@@ -89,11 +89,11 @@ void SectionalSubtitlesView::setLine2RatioOfHeight(double value)
8989
void SectionalSubtitlesView::buildConnect()
9090
{
9191
connect(d_ptr->line1Ptr.data(),
92-
&CustomLineItem::lineChanged,
92+
&SubtitleDividerLineItem::lineChanged,
9393
this,
9494
&SectionalSubtitlesView::line1Changed);
9595
connect(d_ptr->line2Ptr.data(),
96-
&CustomLineItem::lineChanged,
96+
&SubtitleDividerLineItem::lineChanged,
9797
this,
9898
&SectionalSubtitlesView::line2Changed);
9999
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
#include "subtitledividerlineitem.hpp"
2+
3+
#include <graphics/geometrycache.hpp>
4+
5+
SubtitleDividerLineItem::SubtitleDividerLineItem(QGraphicsItem *parent)
6+
: GraphicsLineItem(parent)
7+
{
8+
setMargin(0.5);
9+
setShowBoundingRect(false);
10+
setShowShape(false);
11+
}
12+
13+
void SubtitleDividerLineItem::handleMouseMoveEvent(const QPointF &scenePos,
14+
const QPointF &clickedPos,
15+
const QPointF delta)
16+
{
17+
auto dp = QPointF(0, delta.y());
18+
auto controlPoints = geometryCache()->controlPoints();
19+
20+
switch (mouseRegion()) {
21+
case MouseRegion::EntireShape: controlPoints.translate(dp); break;
22+
default: return;
23+
}
24+
pointsChanged(controlPoints);
25+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
#pragma once
2+
3+
#include <graphics/graphicslineitem.h>
4+
5+
class SubtitleDividerLineItem : public Graphics::GraphicsLineItem
6+
{
7+
public:
8+
explicit SubtitleDividerLineItem(QGraphicsItem *parent = nullptr);
9+
10+
protected:
11+
void handleMouseMoveEvent(const QPointF &scenePos,
12+
const QPointF &clickedPos,
13+
const QPointF delta) override;
14+
};
15+
16+
using SubtitleDividerLineItemPtr = QScopedPointer<SubtitleDividerLineItem>;

examples/graphics/subtitlsplicingwidget.cc

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -216,28 +216,22 @@ void SubtitlSplicingWidget::onDown(int index)
216216
void SubtitlSplicingWidget::onLine1Changed()
217217
{
218218
auto *view = qobject_cast<SectionalSubtitlesView *>(sender());
219-
if (!view) {
220-
return;
221-
}
222-
if (view->index() != 0) {
219+
if (!view || view->index() != 0) {
223220
return;
224221
}
225222

226223
auto radoi = view->line1RatioOfHeight();
227224
for (int i = 1; i < d_ptr->listWidget->count(); i++) {
228-
auto item = d_ptr->listWidget->item(i);
229-
auto view = qobject_cast<SectionalSubtitlesView *>(d_ptr->listWidget->itemWidget(item));
225+
auto *item = d_ptr->listWidget->item(i);
226+
auto *view = qobject_cast<SectionalSubtitlesView *>(d_ptr->listWidget->itemWidget(item));
230227
view->setLine1RatioOfHeight(radoi);
231228
}
232229
}
233230

234231
void SubtitlSplicingWidget::onLine2Changed()
235232
{
236233
auto *view = qobject_cast<SectionalSubtitlesView *>(sender());
237-
if (!view) {
238-
return;
239-
}
240-
if (view->index() != 0) {
234+
if (!view || view->index() != 0) {
241235
return;
242236
}
243237

0 commit comments

Comments
 (0)