- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我打算在 QGraphicsView 上进行平移/缩放操作.
所以我阅读了 QGraphicsView 的文档并查看一些实用函数,如 ensureVisible()和 centerOn() .
我想我明白文档说的是什么,但我无法编写一个工作示例。
你能写/建议我一个示例代码来理解这个问题吗?
最佳答案
将 View 平移一定量(例如在 View 的 mouseMoveEvent()
中),假设 MyView
是 QGraphicsView
的子类(以下代码均为Python移植,本人未测试):
void MyView::moveBy(QPoint &delta)
{
QScrollBar *horiz_scroll = horizontalScrollBar();
QScrollBar *vert_scroll = verticalScrollBar();
horiz_scroll->setValue(horiz_scroll.value() - delta.x());
vert_scroll->setValue(vert_scroll.value() - delta.y());
}
通过缩放和平移来适应场景坐标中指定的矩形:
void MyView::fit(QRectF &rect)
{
setSceneRect(rect);
fitInView(rect, Qt::KeepAspectRatio);
}
请注意,如果您的场景包含不可变换的项目(设置了 QGraphicsItem::ItemIgnoresTransformations
标志),您将必须采取额外的步骤来计算它们的正确边界框:
/**
* Compute the bounding box of an item in scene space, handling non
* transformable items.
*/
QRectF sceneBbox(QGraphicsItem *item, QGraphicsItemView *view=NULL)
{
QRectF bbox = item->boundingRect();
QTransform vp_trans, item_to_vp_trans;
if (!(item->flags() & QGraphicsItem::ItemIgnoresTransformations)) {
// Normal item, simply map its bounding box to scene space
bbox = item->mapRectToScene(bbox);
} else {
// Item with the ItemIgnoresTransformations flag, need to compute its
// bounding box with deviceTransform()
if (view) {
vp_trans = view->viewportTransform();
} else {
vp_trans = QTransform();
}
item_to_vp_trans = item->deviceTransform(vp_trans);
// Map bbox to viewport space
bbox = item_to_vp_trans.mapRect(bbox);
// Map bbox back to scene space
bbox = vp_trans.inverted().mapRect(bbox);
}
return bbox;
}
在这种情况下,您的对象的边界矩形将取决于 View 的缩放级别,这意味着有时 MyView::fit()
不会完全适合您的对象(例如,当适合选择时从很大程度上缩小的 View 中的对象)。一个快速而肮脏的解决方案是重复调用 MyView::fit()
直到边界矩形自然地“稳定”自己。
关于c++ - QGraphicsView ensureVisible() 和 centerOn(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2904902/
请查看视频/gif: 我的网页浏览量将使当前选项卡处于事件状态。我需要确保事件选项卡始终可见,即使用户多次滑动屏幕也是如此。它是从左到右工作的。但是当我们尝试从右向左返回时,它的行为并不像预期的那样。
在我的 Treeview 上:左边是 EnsureVisible() 之前的 TreeView,右边是之后 图标被忽略了。我不知道如何在使用 EnsureVisible() 后显示图标,我会使用 En
我有 2 列。其中一列充满了许多 QWidget。当我将一个小部件放入列中时,我调用此方法: void MainWindow::scrollToItem(Product_View *item) {
我打算在 QGraphicsView 上进行平移/缩放操作. 所以我阅读了 QGraphicsView 的文档并查看一些实用函数,如 ensureVisible()和 centerOn() . 我想我
在获得有关 the previous one 的帮助后,我遇到了 QScrollArea 的另一个问题, 这有点相似。 现在的问题是,如果您创建一个滚动区域和一个标签,将标签设置为滚动区域的小部件,然
我是一名优秀的程序员,十分优秀!