QScrollArea :: ensureVisible()和QScrollArea :: setWidget()

时间:2014-03-26 10:01:11

标签: c++ qt qscrollarea

在我获得the previous one的帮助之后,我遇到了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()甚至setFixedSize(),问题也是可以重现的。

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

1 个答案:

答案 0 :(得分:1)

当您致电ensureVisible(10000, 10000);时,scrollArea尚未调整小部件的大小。这就是它不能工作的原因。

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

如果您在致电ensureVisible后致电show,也会有效。但这只适用于scrollArea是顶级窗口的情况。如果您将其嵌入到窗口小部件中,它将无法工作。