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

时间:2013-06-30 08:41:02

标签: c++ qt

我在图形视图中使用滚动条有以下问题。我的应用程序采用PDF文件并以某种方式创建QImage。然后QImage转换为QPixmap,用于创建QGraphicsSceneQGraphicsScene我创建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);

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

你能就如何做到这一点给我一些建议吗?我已经搜索过这个问题,但到目前为止我的案例中没有任何工作(我本可以做错事)。

感谢您的回答!

2 个答案:

答案 0 :(得分: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_itemscene->addPixmap(pixmap)的存储结果。它有QGraphicsPixmapItem*类型。

答案 1 :(得分: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,view->verticalScrollBar()->value()得到479,这是非常奇怪的,但是当我打印hsbv和{{ 1}}我得到了合理的数字。