6

我在图形视图中遇到以下滚动条问题。我的应用程序需要一个 PDF 文件并(以某种方式)从中创建一个QImage。然后QImage将转换为QPixmap,用于创建 aQGraphicsScene并从QGraphicsSceneI 创建 a QGraphicsView。被QGraphicsView添加到中央小部件并显示。

代码看起来大约像这样

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 文件部分。

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

谢谢您的回答!

4

2 回答 2

2

在更改视图的内容之前,请使用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_item是存储的结果scene->addPixmap(pixmap)。它有QGraphicsPixmapItem*类型。

于 2013-06-30T08:48:53.060 回答
0

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

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 和 479 view->verticalScrollBar()->value(),这很奇怪,但是当我打印时hsbvvsbv我得到了合理的数字。

于 2013-06-30T13:40:34.820 回答