【问题标题】:Qt ensureVisible() not working in QScrollAreaQt ensureVisible() 在 QScrollArea 中不起作用
【发布时间】:2013-01-12 11:39:56
【问题描述】:

我有 2 列。其中一列充满了许多 QWidget。 当我在列中放置一个小部件时,我调用此方法:

void MainWindow::scrollToItem(Product_View *item) {
    QPoint point = item->mapToParent(QPoint());
    ui->scrollArea->ensureVisible(point.x(), point.y());
}

当我位于第一列的底部并在下一列中拖动一个小部件时。滚动区域正确滚动到底部,以便我可以看到我将其放置在哪里。

但是当我将小部件放回第一列时,它会滚动但不会完全滚动到底部。它的大约 150 像素(编辑:150 像素不是真的。我只看到大约 5 像素的小部件)

谁能帮帮我?

编辑:

也许很高兴知道我的布局。

我有一个带有QScrollArea 的主窗口。 scrollArea 有一个名为scrollAreaWidgetContentsQWidget,它有一个QHBoxLayout。 该小部件有 5 列。这些为我的拖放小部件提供了 QVBoxLayout。

JEEZ 另一个编辑:

我注意到只有最后一项有问题。

我只是继续编辑

我现在很清楚滚动条并没有一直向下。

QScrollBar *bar = ui->scrollArea->verticalScrollBar();
bar->setValue(bar->maximum());

此代码也显示相同的行为。我应该怎么处理这个线程?我应该创建一个新的吗?

【问题讨论】:

    标签: qt drag-and-drop qscrollarea


    【解决方案1】:

    ensureVisible 函数只需要一个点,所以使用它只能保证你的小部件的一个角是可见的(我相信左上角?)。尝试改用ensureWidgetVisible - 这应该确保整个小部件都显示在屏幕上。

    希望有帮助!

    【讨论】:

    • 感谢您的回复。使用ensureWidgetVisible 是对的。但我以前这样做过,结果相同。
    【解决方案2】:

    我发现了我的问题。不是解决方案。

    如果我将小部件拖回第一列,我的代码将调用ensureWidgetVisible。 之后,我的 scrollArea 由于新项目而调整大小。这就是为什么我的小部件不完全可见的原因。

    【讨论】:

      【解决方案3】:

      虽然这是一篇较旧的帖子,但我遇到了同样的问题,并且给我寻找解决方案带来了很多麻烦。

      我的问题: 必须向小部件添加新行,然后确保滚动条向下滚动到它以便人们查看它。 OP 在他的回答中很好地描述了这个问题。

      我尝试过的事情是:
      1.最佳方式)在应用对象上调用 processEvents()。看到this的帖子和ratzian的回答后,我尝试了。

      2. 实现您的自定义 ScrollArea,扩展 QScrollArea 并覆盖调整大小处理程序,以便能够在添加的小部件上调用 ensureWidgetVisible。当然,它需要以某种方式了解该小部件对象。

      3. 添加QTimer 并在添加新小部件时启动计时器。计时器调用的方法需要在新的小部件对象上调用 ensureWidgetVisible() 并随后停止计时器。

      我知道 3 有点笨拙,因为它不知道调整大小事件何时发生,因此需要将计时器设置为次优值。 (例如,在 33 毫秒内调用 resize 并将计时器设置为 500 毫秒,你明白了)。

      我希望这能帮助遇到同样问题的人。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-25
        • 2012-05-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多