手动将 QGraphicsView 左上角移动到 QGraphicsScene 中的某个点
Move QGraphicsView top left to a certain point in QGraphicsScene manually
我有一个 QGraphicsView
子类,包含一个 QGraphicsScene
子类,在 QWidget
.
中
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);
}
不管有没有对齐设置(我认为这可能会对其他地方产生不良影响),这都会使视图...移动得太远。
虽然一定有更好的方法...我找到了一种方法,通过执行 fitInView
两次来使我的 0 对齐:
void MyWidget::showEvent(QShowEvent *event)
{
static bool startUp = true;
if(startUp)
{
QSizeF sz = m_scene->getActualSize();
// First I do a normal `fitInView` that centers the rectangle
ui->graphicsView->fitInView(QRectF(0, 0, sz.width(), sz.height()), Qt::KeepAspectRatio);
// Then, knowing the shift, I fit it again adding twice the shift to the size.
QPointF zero = ui->graphicsView->mapToScene(QPoint(0,0));
ui->graphicsView->fitInView(QRectF(0, 0, sz.width() - 2 * zero.x(), sz.height() - 2 * zero.y()), Qt::KeepAspectRatio);
startUp = false;
}
QWidget::showEvent(event);
}
如果我对你的问题理解正确,为了达到你想要的效果,你可以使用方法
QGraphicsView::setAlignment(Qt::Alignment 对齐):
ui->graphicsView->setAlignment( Qt::AlignTop | Qt::AlignLeft );
在您的代码中有注释。
使用这些参数的此方法将视图左上角对齐,您无需移动或调整任何内容。
我有一个 QGraphicsView
子类,包含一个 QGraphicsScene
子类,在 QWidget
.
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);
}
不管有没有对齐设置(我认为这可能会对其他地方产生不良影响),这都会使视图...移动得太远。
虽然一定有更好的方法...我找到了一种方法,通过执行 fitInView
两次来使我的 0 对齐:
void MyWidget::showEvent(QShowEvent *event)
{
static bool startUp = true;
if(startUp)
{
QSizeF sz = m_scene->getActualSize();
// First I do a normal `fitInView` that centers the rectangle
ui->graphicsView->fitInView(QRectF(0, 0, sz.width(), sz.height()), Qt::KeepAspectRatio);
// Then, knowing the shift, I fit it again adding twice the shift to the size.
QPointF zero = ui->graphicsView->mapToScene(QPoint(0,0));
ui->graphicsView->fitInView(QRectF(0, 0, sz.width() - 2 * zero.x(), sz.height() - 2 * zero.y()), Qt::KeepAspectRatio);
startUp = false;
}
QWidget::showEvent(event);
}
如果我对你的问题理解正确,为了达到你想要的效果,你可以使用方法
QGraphicsView::setAlignment(Qt::Alignment 对齐):
ui->graphicsView->setAlignment( Qt::AlignTop | Qt::AlignLeft );
在您的代码中有注释。 使用这些参数的此方法将视图左上角对齐,您无需移动或调整任何内容。