gpt4 book ai didi

qt - 在 Qt GraphicsView 中创建长线(或交叉线)光标的最佳方法

转载 作者:行者123 更新时间:2023-12-04 22:25:04 31 4
gpt4 key购买 nike

创建长十字线光标(只要视口(viewport))的简单方法是创建十字线graphicsItem ,当鼠标移动时,设置项目的pos属性(property)。
但是这种方式在场景复杂的时候会很慢,因为要更新整个视口(viewport)来更新光标的pos .

另一种简单的方法是setCursor(QCursor(..)) ,使用 QPixmap定义长十字线,这种方式会很快,但光标会超出视口(viewport)矩形。

还有另一种方法可以快速显示长十字线光标吗?

非常感谢!

最佳答案

如果我理解正确,您想绘制一条水平线和一条垂直线,在光标位置交叉,并且与视口(viewport)一样大。

一个可行的解决方案是重新实现 QGraphicsScene::drawForeground()用画家画两条线。

问题是场景不知道鼠标位置。这意味着 View 必须跟踪它并在鼠标位置发生变化时通知场景。

为此,您必须创建自己的 GraphicsScene (继承 QGraphicsScene )和你自己的 GraphicsView (继承 QGraphicsView )。

在您的 GraphicsView 上构造函数,你必须开始鼠标跟踪。这将使您收到 mouseMoveEvent每次鼠标在 View 内移动时:

GraphicsViewTrack::GraphicsViewTrack(QWidget* parent) : QGraphicsView(parent) {
setMouseTracking(true);
}

void GraphicsViewTrack::mouseMoveEvent(QMouseEvent* pEvent) {
QPointF MousePos = this->mapToScene(pEvent->pos());
emit mousePosChanged(MousePos.toPoint());
}

正如您在上面的代码片段中看到的, View 正在发出一个信号( mousePosChanged),场景将连接到该信号。该信号包含鼠标位置,转换为场景坐标。

现在,在场景方面,您必须添加一个将在鼠标位置更改时调用的插槽,将新的鼠标位置存储在成员变量中并重新实现 QGraphicsScene::drawForeground() :
void GraphicsSceneCross::drawForeground(QPainter* painter, const QRectF& rect) {
QRectF SceneRect = this->sceneRect();

painter->setPen(QPen(Qt::black, 1));
painter->drawLine(SceneRect.left(), m_MousePos.y(), SceneRect.right(), m_MousePos.y());
painter->drawLine(m_MousePos.x(), SceneRect.top(), m_MousePos.x(), SceneRect.bottom());
}

void GraphicsSceneCross::onMouseChanged(QPoint NewMousePos) {
m_MousePos = NewMousePos; // Store the mouse position in a member variable
invalidate(); // Tells the scene it should be redrawn
}

最后要做的是将 GraphicsView 的信号连接到 GraphicsScene 插槽。

我会让你检查这个解决方案在性能方面是否可以接受。

关于qt - 在 Qt GraphicsView 中创建长线(或交叉线)光标的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4698029/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com