标签: qgraphicsitem

QGraphicsItem不接收鼠标悬停事件

我有一个派生自的类QGraphicsView,其中包含 - QGraphicsItem派生元素.我希望这些元素在鼠标光标悬停在它们上面时改变颜色,所以我实现了hoverEnterEvent(和hoverLeaveEvent):

void MyGraphicsItem::hoverEnterEvent(QGraphicsSceneHoverEvent* event)
{
    update (boundingRect());
}
Run Code Online (Sandbox Code Playgroud)

但是,此事件处理程序代码永远不会执行.我明确启用了鼠标跟踪:

MyGraphicsView::MyGraphicsView(MainView *parent) :
    QGraphicsView(parent)
{
    setMouseTracking(true);
    viewport()->setMouseTracking(true);
    ...
}
Run Code Online (Sandbox Code Playgroud)

不过,没有运气.我究竟做错了什么?

c++ events qt qgraphicsview qgraphicsitem

19
推荐指数
2
解决办法
9708
查看次数

查找QGraphicsItem的屏幕位置

使用案例:这应该是一个相当普遍的问题.在正常的QMainWindow中,QMdiArea与QGraphicsView一起生活在mdiChild中.此视图显示内部带有QGraphicsItems的QGraphicsScene.右键单击其中一个项目可选择(聚焦)项目并打开上下文菜单,该菜单可方便地放置在屏幕坐标处QGraphicsSceneMouseEvent::screenPos().这是按预期工作的.

现在,当用户按下某个键(例如Qt :: Key_Menu)时,我想显示相同的上下文菜单.我知道所选的(聚焦的)项目,我知道显示场景的视图.

所以我的问题是:
获取场景中QGraphicsItem的可见表示的位置(在全局,屏幕坐标中)的正确方法什么?

这是什么不起作用:

QGraphicsItem *item = ...; // is the currently selected item next to which the context menu shall be opened
QGraphicsScene *scene = ...; // is the scene that hosts the item
QGraphicsView *graphicsView = ...; // is the view displaying the scene, this inherits from QWidget

// get the position relative to the scene
QPointF sp = item->scenePos();
// or use
QPointF sp = item->mapToScene(item->pos());

// find the …
Run Code Online (Sandbox Code Playgroud)

c++ qt position viewport qgraphicsitem

12
推荐指数
1
解决办法
1万
查看次数

什么是QGraphicsScene :: itemAt()中的qtransform

我创建了一个自定义QGraphicsItem.并覆盖boundingRect()paint().

QRectF myTile::boundingRect() const
{
  return QRectF(xPos*10, yPos*10, 10, 10);
}

void myTile::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
  QRectF rec = boundingRect();
  int gvi = value * 255;
  QColor gv(gvi, gvi, gvi, 255);
  QBrush brush(gv);
  painter->fillRect(rec, brush);
  painter->drawRect(rec);
}
Run Code Online (Sandbox Code Playgroud)

然后我用来addItem()向场景添加一个项目.现在我想通过它的位置从现场得到它.我找到了这个itemAt功能.但问题是我不知道const QTransform&是什么deviceTransform.我该QTransform怎么用?

因为我没有实现任何变换QGraphicsItem.这让我很困惑.

c++ qt qgraphicsitem qgraphicsscene

12
推荐指数
1
解决办法
7173
查看次数

QGraphicsItem :: prepareGeometryChange()如何工作?

根据Qt文档,它"为几何变化准备项目.在更改项目的边界矩形之前调用此函数以使QGraphicsScene的索引保持最新.如果有必要,prepareGeometryChange()将调用update()."

我不明白的是QGraphicsItem如何知道边界矩形何时发生变化,以及它如何知道何时调用update().您是否应该在调用prepareGeometryChange()然后更改边界矩形后自己调用update()?

我非常感谢对一些看似透视的方法有所了解.

qt qgraphicsitem

11
推荐指数
1
解决办法
5639
查看次数

C++中静态和全局的替代方案?

我有一个类实例需要由其他一些类访问.

  • 将实例始终传递到构造链中会非常麻烦.
  • 我试图避免全局变量,因为人们倾向于反对这一点.
  • 我以为我声明这个实例是一个类的静态成员,然后包含这个类,以便访问该实例,但这不起作用

error: calling a private constructor of class 'Foo'

要在QGraphicsView框架的上下文中进一步指定问题:我想添加QGraphicsItems,它由控制器类(管理项目)实例化到QGraphicsScene,这是(但我不坚持这个细节)我的成员QMainWindow类.

我花了相当多的时间在互联网上搜索,但我相当新,我有点被困在这里.对于解决困境的最佳方法,我表示赞赏.

c++ static global qgraphicsitem qgraphicsscene

11
推荐指数
1
解决办法
1823
查看次数

为什么在销毁之前从场景中删除QGraphicsItem会更有效率?

根据QGraphicsItem析构函数文档,"在销毁项目之前从QGraphicsScene中删除项目更有效."

这是为什么?我想不出它会如何产生影响.如果确实有所作为,那么QGraphicsItem析构函数不应该只调用:

if (scene() != NULL)
    scene()->removeItem(this);
Run Code Online (Sandbox Code Playgroud)

我检查了源代码,这似乎并非如此,尽管有时我很难理解Qt源代码.编辑:请参阅jdi的答案中的评论.

qt qgraphicsitem qgraphicsscene

10
推荐指数
1
解决办法
3260
查看次数

如何在addItem或itemChange上从QGraphicsScene获取通知?

在我的项目中,我正在使用a QGraphicsScene并在代码中添加/删除项目.

现在,我想QGraphicsItem在添加或删除时收到通知.许多Qt类具有通知信号或至少被调用此类更改的虚函数.我试图避免在许多地方添加许多行代码,这不仅麻烦而且不安全(忘记现在或将来的插入/删除).

我需要一个适用于任何方案的解决方案QGraphicsItem.

这是一个不起作用的事情列表:

  • 连接到QGraphicsScene (如QAbstractItemModel::rowsInserted())的信号- >没有.
  • 继承QGraphicsScene并重载虚拟通知程序函数(如QTabWidget::tabInserted()) - >没有.
  • 继承和重载addItem(),自己发送通知(如QMdiArea::addSubWindow()) - > addItem不是虚拟的,并从构造函数中调用QGraphicsItems.
  • 在新添加的事件上安装事件过滤器QGraphicsItems- >不知道如何获取新添加的项目,它将sceneEventFilter只能安装在其他项目上QGraphicsItems.
  • 连接到itemChange()QGraphicsItem- > itemChange是不是一个信号和重载QGraphicsItem是不是一种选择.
  • 换行QGraphicsScene(将场景作为私有成员)并且只显示函数addItemremoveItem- >但是QGraphicsItems在那个场景中仍然可以通过scene()函数访问它,所以这个解决方案不够安全.

如何获得有关项目更改的通知?

如果有一个我错过的简单方法,请指出我.另外,我非常欣赏这方面的想法.

notifications qt signals qgraphicsitem qgraphicsscene

10
推荐指数
1
解决办法
1433
查看次数

防止QGraphicsItem移出QGraphicsScene

我有一个固定尺寸从(0; 0)到(481; 270)的场景:

scene->setSceneRect(0, 0, 481, 270);
Run Code Online (Sandbox Code Playgroud)

在它内部,我有一个自定义GraphicsItem,我可以移动它感谢旗帜ItemisMovable,但我希望它留在场景中; 我的意思是我不希望它的坐标既不在(0; 0)之下也不在(481; 270)之下.

我尝试过几种解决方案,比如压倒一切QGraphicsItem::itemChange(),QGraphicsItem::mouseMoveEvent()但我仍然无法达到我想做的目标.

什么是适合我需求的解决方案?我使用QGraphicsItem::itemChange()得不好吗?

提前致谢.

qt qgraphicsitem qgraphicsscene

10
推荐指数
3
解决办法
4472
查看次数

Qt GraphicsView拉伸场景以适应

好的,所以我使用Qt和C++作为我的环境.

QGraphicsView在我的UI中绘制了一个.

然后我创建一个场景并为该场景添加线条.我运行5000点的数组并画出连接每个点的线.

QGraphicsScene *scene = new QGraphicsScene();
QPen pen2 = QPen(Qt::blue, 8.0);
int j=1;
for (int i=1; i<5000; i++)
{
    scene->addLine(xArray[i],yArray[i],xArray[j],yArray[j], pen2);
    j++;
}
Run Code Online (Sandbox Code Playgroud)

问题是我抓到的数字非常小,例如2.000e-12.这些数字将根据应用程序不断变化.如何调整我的场景以拉伸以填充我的QGraphicsView.现在,我看到的只是我视角中心的一个点.我有道理吗?

c++ qt qgraphicsitem

9
推荐指数
2
解决办法
9636
查看次数

QGraphicsItem未呈现为HiDPI

在Qt地图应用程序(QGIS)中,地图画布是QGraphicsItem.我们不使用任何OpenGL,每个元素都使用QPainter渲染.

除地图画布外,我们的应用程序在HiDPI上正确显示.

查看地图中的像素线:

在此输入图像描述

我看了什么:

  • 关于HiDPI的 Qt doc.已经做了什么(mac上的info.plist,使用浮点签名用于painter方法)
  • 关于Qt 的错误报告,但它似乎与OpenGL和项目缓存有关,我们不使用它.

与画家,我们正在使用QPainter::Antialiasing.

在这里发布代码并不容易,但这里是一个链接到渲染行的源代码.

我一直试图做一个最小的再现例子,但我仍然在这里失败.

提示是,只要鼠标位于地图画布上,光标的大小就会加倍(它太大).我会说大约是我设备像素比的 2倍.

我不确定这是一个只有Mac的问题(它似乎也发生在Linux上,但不是在Windows上).关于可伸缩性的Qt文档声明Mac以不同方式处理它.

我真的不知道该寻找什么,我希望得到一些提示.

qt high-resolution qgraphicsview qgraphicsitem hidpi

9
推荐指数
0
解决办法
95
查看次数