QItemSelectionModel::currentChanged信号为啥自动触发

fly4free 2020-05-02 11:18:23
把数据加载到QTreeView中,用的是QStandardItemModel 程序有那种删除选中项的业务功能,这个以前也做过 但是今天发现,没选中的时候,QItemSelectionModel::currentIndex() 居然是有效的:(0,0) 还有个按钮,是刷新,重新加载数据,频繁点击后,结果有时候正常(没选中的时候,QModelIndex是无效的),有时候不正常……… 百思不得其解,后来监视到底谁改了,结果还真是改了。 调用堆栈挺多内容的,反正大概就是,ui可能要“刷新/显示/激活”的时候,“自动设置选中为(0,0)” 但是你要选中就选中,可为啥不更新ui啊??UI看得是没选中的!!造成很大误会。 我之前直接在窗口中用的,没遇到这个问题, 现在我放在了qstackwidget 里,不知道是不是这个原因? 谁知道到底为啥啊?有什么方法能解决这个问题?
...全文
1749 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
fly4free 2020-05-03
  • 打赏
  • 举报
回复 1
解决了,是我理解有误。

经过帮助查看 QItemSelectionModel 类,看到有 selectedIndexes() 方法

而我的 QTreeView 这样设置:
ui->customerInfoView->setSelectionMode(QAbstractItemView::SingleSelection);
ui->customerInfoView->setSelectionBehavior(QAbstractItemView::SelectRows);


所以返回值只要至少有一个就说明用户选中了,就这意思:

QModelIndexList indexes = selectModel->selectedIndexes();
int idxCnt = indexes.size();
if (idxCnt <= 0) {
QMessageBox::warning(this, _tr("提示"), _tr("请选择"));
return;
}
QModelIndex selectedIndex = indexes[0];


问题的关键所在是:currentIndex() 返回的 不是指用户的选择,毕竟对于这种 View,可以有多个选中项,一个 QModelIndex 根本不足以表达。


过来接分?
fly4free 2020-05-03
  • 打赏
  • 举报
回复
这是断点信息,今早重新截的图:



看到里面的 QAbstractItemView::focusInEvent 我想起了 focusPolicy 默认设置的是 StrongFocus,而以前"表现正常"的项目默认也是这个值,昨晚弄得头大没多想,今天就暂且一试换一下把,换成 【ClickFocus】,程序运行,初始【的确是没选中状态】,但是,

我的删除按钮,有用 QModelIndex::isValid() 检测是否选中,没有选中的话弹一个 QMessageBox 提示出来
那么接下来我依次点击【刷新】(清空、再赋值Model数据)->【删除】(正常弹出提示框)->【Alt+Tab切换窗口、再切回去】(有的时候不用切)->【删除】,第二次【删除】后就不弹出了,因为继续执行,代码还没写。

这样下来,说明只要框架判断有需要,他就给我调用聚焦相关代码,但是UI却不给我相应的更新,让人看不到已经选择了?!这是bug吗?

之前是直接把 QTreeView 拖进 MainWindow ,表现是我所预估的
现在 MainWindow 有一个 QStackedWidget 我把这个 QTreeView 放在了 第二页,出现问题,但这有啥区别?

Qt 5.12.7
Italink 2020-05-03
  • 打赏
  • 举报
回复
不要脸的来了=.=

16,211

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧