gpt4 book ai didi

c++ - QTableView::scrollTo 在模型重置后和一些延迟后立即

转载 作者:搜寻专家 更新时间:2023-10-31 02:05:59 25 4
gpt4 key购买 nike

我使用 QTableView 和自定义模型,我想在之后滚动到特定项目模型更新。

我创建了两个按钮“更新模型”和“滚动到”:

 btn->setText("Update model");
QObject::connect(btn, &QPushButton::clicked, [&tbl_model, view] {
tbl_model.update();
auto idx = tbl_model.index(49, 0);
qDebug() << "idx: " << idx;
view->scrollTo(idx, QAbstractItemView::PositionAtCenter);
});

btn->setText("scroll to");
QObject::connect(btn, &QPushButton::clicked, [view, &tbl_model] {
auto idx = tbl_model.index(49, 0);
qDebug() << "idx: " << idx;
view->scrollTo(idx, QAbstractItemView::PositionAtCenter);
});

更新方法代码:

  void update() {
beginResetModel();
auto new_size = data_.size() == 100 ? 50 : 100;
data_.clear();
for (int i = 0; i < new_size; ++i) {
data_.append(i + 1);
}
endResetModel();
}

如果我按“更新模型”,我的模型大小从 50 扩大到 100,然后我在窗口底部看到 row==49 的项目,然后如果我按下“滚动到”按钮,我会看到它在中心。

那么在模型完全更新后我应该如何使用scrollTo呢?当然,我可以添加 processEvents 或使用 QTimer::singleShot,但它看起来像 hack,可能有一些事件或信号查看准备好滚动了吗?

Full code

最佳答案

出于某种原因,在调用 QTableView::scrollTo() 之前, View 需要在重置模型(以处理某些事件)后进入事件循环。为了使后者正常工作。我记得在使用 Qt 的时候遇到过很多次类似的情况。

我不觉得使用像 QTimer 之类的东西来安排 scrollTo 以后真的很糟糕。如果您更喜欢可读性更强的解决方案,请查看 this answer .基本上,您可以定义自己的 QueuedInvoke 函数,如下所示:

//the functor gets invoked in the thread where the contextObject lives
//or in the current thread if no contextObject is provided
template <typename Func>
void QueuedInvoke(Func&& f, QObject* contextObject = QAbstractEventDispatcher::instance()){
QObject signalSource;
QObject::connect(&signalSource, &QObject::destroyed,
contextObject, std::forward<Func>(f), Qt::QueuedConnection);
}

之后,您只需将调用 scrollTo 的行替换为如下内容:

QueuedInvoke([view, idx]{
view->scrollTo(idx, QAbstractItemView::PositionAtCenter);
}, view);

关于c++ - QTableView::scrollTo 在模型重置后和一些延迟后立即,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50989433/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com