QTreeView设置QSpinBox委托,焦点不能取消
前言
最近在项目开发过程中遇到一个很棘手的bug,在QTreeView中使用QSpinBox委托会导致QSpinBox中的值焦点一直不能取消,但是通过Alt + Tab切换界面后,又可以正常显示。选中状态如下图所示:
尝试解决
如下代码都是我尝试的解决的代码。
- 遍历找到QSpinBox列,设置 clearFocus,设置子控件QLineEdit 的 deSelect 均失败
- 设置treeView 不获取焦点,设置子视图不获取焦点,均失败
- 在代理中设置控件不获取焦点:spinBox->clearFocus(); 均失败
- 各种搜索,均失败
QTimer::singleShot(1000, [=](){
qDebug() << __LINE__ << __FUNCTION__ << "value= " << 222;
// 去掉选中
QList<QSpinBox*> lstLineEditors = ui->treeView->findChildren<QSpinBox*>();
foreach(QSpinBox* pLineEdit, lstLineEditors)
{
pLineEdit->clearFocus();
qDebug() << __LINE__ << __FUNCTION__ << "value= " << pLineEdit;
pLineEdit->repaint();
pLineEdit->update();
pLineEdit->setReadOnly(true);
pLineEdit->setValue(111);
}
ui->treeView->clearFocus();
ui->treeView->setFocusPolicy(Qt::NoFocus);
ui->treeView->clearSelection();
ui->treeView->viewport()->clearFocus();
ui->treeView->viewport()->setFocusPolicy(Qt::NoFocus);
this->update();
qDebug() << __LINE__ << __FUNCTION__ << "value= " << 77;
});
解决
终于功夫不负有心人,我在: https://bugreports.qt.io/ qt报告bug的网站找到了,原来已经有人遇到了。于是乎在评论中找到了答案。
- 重写QSpinBox的Event函数
- 设置当QSpinBox 修改的时候取消焦点
#include "myspinbox.h"
#include <QEvent>
#include <QLineEdit>
MySpinBox::MySpinBox(QWidget *parent) : QSpinBox(parent)
{
}
bool MySpinBox::event(QEvent *event)
{
switch (event->type())
{
case QEvent::Polish:
lineEdit()->deselect();
break;
}
return QSpinBox::event(event);
}
代理中将原来的QSpinBox替换成自己重写的MySpinBox
MySpinBox *spinBox = static_cast<MySpinBox*>(editor);
spinBox->interpretText();
int value = spinBox->value();
model->setData(index, value, Qt::UserRole);
model->setData(index, value, Qt::EditRole);
spinBox->clearFocus();
最终完美解决问题
总结
当你搜遍全网找不到答案的时候可以去qt报告bug的网站看看。
版权声明:
作者:小何
链接:https://ligo100.cn/houduanjishu/qt/648.html
来源:小何博客
文章版权归作者所有,未经允许请勿转载。
THE END
二维码
打赏
![](https://ligo100.cn/wp-content/uploads/2021/05/qq-jie-tu-20210505165730.png)
文章目录
关闭
共有 0 条评论