【发布时间】:2018-06-17 23:37:53
【问题描述】:
我有一个QGraphicsView 子类,在QWidget 内拥有一个QGraphicsScene 子类。
QGraphicsScene 有一个实际的绘图矩形,其顶角位于 (0,0)(因此场景确实有一个与问题无关的 QRectF(-x,-y,w,h) 值)。
在启动时,实际上在小部件的showEvent 中,我设置了场景的大小以适合自定义大小的矩形。这也是它的中心。
我想要的是在开始时将场景的 (0,0) 点与视图的左上角匹配。
与其他同名问题不同,我实际上需要移动视图,而不是场景中的项目。
图1:实际开始,图2:期望
我正在尝试:
void MyWidget::showEvent(QShowEvent *event)
{
static bool startUp = true;
if(startUp)
{
QSizeF sz = m_scene->getActualSize();
ui->graphicsView->fitInView(QRectF(0, 0, sz.width(), sz.height()), Qt::KeepAspectRatio);
QPointF zero = ui->graphicsView->mapFromScene(QPointF(0,0));
ui->graphicsView->translate(-zero.x(), -zero.y()); // or positive
startUp = false;
}
QWidget::showEvent(event);
}
注意:我使用 fitInView 来获得所需的缩放 - 它还使所需的矩形成为焦点 - 但在视图中居中。
我也试过了
void GraphicsView::alignToZero()
{
QPointF zero = this->mapFromScene(QPointF(0,0));
this->scrollContentsBy(-zero.x(), -zero.y());
}
void MyWidget::showEvent(QShowEvent *event)
{
static bool startUp = true;
if(startUp)
{
QSizeF sz = m_scene->getActualSize();
ui->graphicsView->fitInView(QRectF(0, 0, sz.width(), sz.height()), Qt::KeepAspectRatio);
ui->graphicsView->alignToZero();
startUp = false;
}
QWidget::showEvent(event);
}
还是没有结果。
也试过
void MyWidget::showEvent(QShowEvent *event)
{
static bool startUp = true;
if(startUp)
{
QSizeF sz = m_scene->getActualSize();
ui->graphicsView->fitInView(QRectF(0, 0, sz.width(), sz.height()), Qt::KeepAspectRatio);
QPointF zero = ui->graphicsView->mapFromScene(QPointF(0,0));
//ui->graphicsView->setAlignment(Qt::AlignLeft | Qt::AlignTop);
ui->graphicsView->horizontalScrollBar()->setValue(zero.x());
ui->graphicsView->verticalScrollBar()->setValue(zero.y());
startUp = false;
}
QWidget::showEvent(event);
}
无论有没有对齐设置(我认为这可能会在其他地方产生不良影响),这都会将视图移动......太远了。
【问题讨论】:
标签: qt qgraphicsview qgraphicsscene