1

在获得前一个QScrollArea问题的帮助后,我遇到了另一个问题,这有点相似。

现在的问题是,ensureVisible()如果您创建一个滚动区域和一个标签,将标签设置为滚动区域的小部件,然后将图像加载到标签中 -之后 setWidget()

此示例说明了问题,只需替换/path/to/some/image.png为您计算机上的一些真实图像:

QScrollArea *scrollArea = new QScrollArea;
QLabel *label = new QLabel(scrollArea);
scrollArea->setWidgetResizable(true);
scrollArea->setWidget(label);
label->setPixmap(QPixmap("/path/to/some/image.png"));
label->setFixedSize(label->pixmap()->size());
scrollArea->ensureVisible(10000, 10000);
scrollArea->show();

如果之前setPixmap()调用 setWidget()ensureVisible()将起作用。

此外,即使我调用setWidgetResizable()and ,问题也是可重现的setFixedSize()

为什么会发生这种情况,是否可以在ensureVisible()不更改setWidget()and顺序的情况下进行工作setPixmap()

4

1 回答 1

1

当您调用ensureVisible(10000, 10000);scrollArea 时尚未调整小部件的大小。这就是为什么它不起作用。

如果您创建一个调用ensureVisible并用于QTimer::singleShot调用该插槽并将超时设置为 0 的插槽(您也可以QMetaObject::invokeMethod与排队连接一起使用),即使您在设置标签上的像素图之前设置了滚动区域的小部件,它也会起作用。

同样有效的是,如果你打电话ensureVisible后打电话show。但这仅在您scrollArea是顶级窗口时才有效。如果将其嵌入到小部件中,它将不起作用。

于 2014-03-26T13:15:38.693 回答