查看整个 QGraphicsScene
Posted
技术标签:
【中文标题】查看整个 QGraphicsScene【英文标题】:Viewing entire QGraphicsScene 【发布时间】:2012-04-02 12:11:39 【问题描述】:我正在尝试在 Qt 中编写一个地图编辑器,将 QGraphicsView 和 QGraphicsScene 用于地图和瓦片表。
我现在遇到的问题是制作一个用于导入图块的好小部件。为此,我使用 QTabWidget(用于不同的 tile sheet),并使用 TileWidget 作为每个选项卡的小部件,其中包含 QGraphicsScene 和 QGraphicsView。
它在某种程度上可以工作,但并不是所有的图块(或 TileObjects,它们是 QGraphicsItem 的实现)都是可见的。我什至打电话给view->ensureVisible(scene->sceneRect())
,但仍然不是所有的 QGraphicsScene 都不可见,即使有滚动条。
我知道这是由于限制了我的 QTabWidget 的最大大小,但这是必要的。
这主要发生在我导入更大的图块时。
我有一个TileWidget
作为QWidget
的QTabWidget
,它同时具有QGraphicsScene
和QGraphicsView
。
TileWidget::TileWidget(QWidget *parent)
: QWidget(parent)
scene = new QGraphicsScene;
view = new TileView(scene, this);
connect(view, SIGNAL(newBrushSelected(TileObject *b)), this, SLOT(selectNewBrush(TileObject *b)));
TileView
只是一个 QGraphicsView
重新实现以处理鼠标释放事件。
要添加图块,我只需调用scene->addItem()
。
我没有TileView
的其他代码。当我使用
void TileWidget::showEvent(QShowEvent *event)
view->fitInView(scene->itemsBoundingRect(), Qt::KeepAspectRatio);
我得到这样的东西。
较小的瓷砖可以使用,但较大的瓷砖不可以。我应该添加什么来保持图块大小正常,并使用滚动条导航 TileView?
没关系,想通了。只是我很笨。
【问题讨论】:
【参考方案1】:你需要这样的东西:
p_myGraphicsView->fitInView(
myGraphicsView->scene()->itemsBoundingRect(),
Qt::KeepAspectRatio);
【讨论】:
这是记录在案的做你想做的事的方式。当然,这只有在QGraphicsItem::boundingRect()
的实现是正确的情况下才有效。我担心托管您的图片的网站在我工作时被屏蔽了,所以如果在此期间没有其他人回答,我会稍后再看看。
我意识到我错误地实现了你的代码。当没有添加任何项目时,我在构造函数中调用它。但是,在添加所有项目后调用它也无济于事。它将所有瓷砖缩小到一个很小的角落。添加所有项目后,我尝试使用setSceneRect()
。有了它,所有水平的瓷砖都是可见的,但我仍然不能一直向下滚动。你需要我发布一些代码吗?也许我完全错误地实现它。
@Rikonator,代码不应进入构造函数。 QGraphicsView 的细微差别之一是,在 after 显示之前,您不能对它做很多事情(在构造函数的末尾还没有显示)。尝试重新实现 QWidget::showEvent(),然后将 Styne666 的代码放在那里。
澄清一下,我并不是要重新实现 QGraphicsView::showEvent() (虽然这可能有效,但我不知道......),我的意思是重新实现 QDialog::showEvent() ,或任何你的窗口。
t 适用于较小的瓷砖。但是,对于较大的,它会尝试在小部件中适应场景,因此图块表按比例缩小。我尝试为QGraphicsView
设置viewport()
的最大尺寸,但我仍然无法滚动整个场景以获得更大的瓷砖。这是否与QAbstractScrollArea
的QGraphicsView
有更多关系?以上是关于查看整个 QGraphicsScene的主要内容,如果未能解决你的问题,请参考以下文章