QScrollArea :: ensureVisible()和QScrollArea :: setW

2019-10-19 16:26发布

我遇到的另一个问题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()

Answer 1:

当你调用ensureVisible(10000, 10000); 该scrollArea还没有调整物件的尺寸呢。 这就是为什么它不会工作。

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

什么也适用,如果你调用ensureVisible你打电话后show 。 但是,如果你这仅适用scrollArea是一个顶层窗口。 如果你把它嵌入到窗口小部件,它不会工作。



文章来源: QScrollArea::ensureVisible() and QScrollArea::setWidget()