C++Qt QGraphicsView:重新加载后记住滚动条的位置



图形视图中的滚动条有以下问题。我的应用程序获取一个PDF文件,并(以某种方式)从中创建一个QImage。然后将QImage转换为QPixmap,用于创建QGraphicsScene,并从QGraphicsScene创建QGraphicsViewQGraphicsView被添加到中央窗口小部件并被显示。

代码看起来大致像这个

QImage image;
image = loadImage(path);
QPixmap pixmap;
pixmap.convertFromImage(image);
scene = new QGraphicsScene(this);
scene->addPixmap(pixmap);
view = new QGraphicsView(scene);
textEdit = new QTextEdit(this)
QVBoxLayout *layout = new QVBoxLayout;
layout->addWidget(view);
layout->addWidget(textEdit);
QWidget *widget = new QWidget;
widget->setLayout(layout);
setCentralWidget(widget);

在应用程序中,view在每次PDF文件更改时都会更新。现在的问题是,PDF文件中的东西也可能改变大小,滚动条也会变得一团糟。我希望更新后的滚动条位于某个位置,这样我将看到与更新前相同的PDF文件部分。

你能给我一些如何做到这一点的建议吗?我已经搜索过这个问题,但到目前为止,在我的情况下没有任何结果(我也可能做错了什么)。

谢谢你的回答!

在更改视图内容之前,请记住使用view->horizontalScrollBar()->value()view->verticalScrollBar()->value()的滚动条位置。

更改后,使用setValue(int)重置以前的值。

糟糕的是,你没有提供任何你试图用来实现这一点的代码,所以我不能告诉你你做错了什么。

这里有一个例子:

int pos_x = view->horizontalScrollBar()->value();
int pos_y = view->verticalScrollBar()->value();
pixmap_item->setPixmap(QPixmap::fromImage(new_image));
view->horizontalScrollBar()->setValue(pos_x);
view->verticalScrollBar()->setValue(pos_y);

这里,pixmap_itemscene->addPixmap(pixmap)的存储结果。具有QGraphicsPixmapItem*型。

我已经更改了代码,但它的行为很奇怪。

QImage image;
image = loadImage(path);
QPixmap pixmap;
pixmap.convertFromImage(image);
scene = new QGraphicsScene(this);
scene->addPixmap(pixmap);
int hsbv = -1;
int vsbv = -1;
if (view != NULL) {
  hsbv = view->horizontalScrollBar()->value();
  vsbv = view->verticalScrollBar()->value();
}     
view = new QGraphicsView(scene);
textEdit = new QTextEdit(this)
QVBoxLayout *layout = new QVBoxLayout;
layout->addWidget(view);
layout->addWidget(textEdit);
QWidget *widget = new QWidget;
widget->setLayout(layout);
setCentralWidget(widget);
view->horizontalScrollBar()->setVealue(hsbv);
view->verticalScrollBar()->setValue(vsbv);

当我最后打印出view->horizontalScrollBar()->value()时,我总是得到83,view->verticalScrollBar()->value()得到479,这是非常小的,但当我打印hsbvvsbv时,我得到了合理的数字。

最新更新