QTreeView设置QSpinBox委托,焦点不能取消

前言

最近在项目开发过程中遇到一个很棘手的bug,在QTreeView中使用QSpinBox委托会导致QSpinBox中的值焦点一直不能取消,但是通过Alt + Tab切换界面后,又可以正常显示。选中状态如下图所示:

尝试解决

如下代码都是我尝试的解决的代码。

  1. 遍历找到QSpinBox列,设置 clearFocus,设置子控件QLineEdit 的 deSelect 均失败
  2. 设置treeView 不获取焦点,设置子视图不获取焦点,均失败
  3. 在代理中设置控件不获取焦点:spinBox->clearFocus();  均失败
  4. 各种搜索,均失败
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的网站找到了,原来已经有人遇到了。于是乎在评论中找到了答案。

  1. 重写QSpinBox的Event函数
  2. 设置当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
分享
二维码
打赏
< <上一篇
下一篇>>
文章目录
关闭
目 录