如何保持鼠标焦点一直停留在QLineEdit上?

zzwdkxx 2017-05-16 10:50:55
遇到这样一个需求,当输入数值错误,鼠标点击其他部件后焦点不会转移,一直停留在之前的编辑框中,怎么才能做到?

试着用事件过滤器,各种尝试都不行,不知道该该怎样过滤了:

bool InjectionPhase::eventFilter(QObject *obj, QEvent *event)
{
if((obj == rateEdit) && (
//(event->type() == QEvent::FocusIn) ||
(event->type() == QEvent::FocusOut) //||
//(event->type() == QEvent::FocusAboutToChange)
) )
{
//rateEdit->setFocus();

return true;
}

return QWidget::eventFilter(obj, event);
}
...全文
1126 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
zzwdkxx 2017-12-14
  • 打赏
  • 举报
回复 1
混杂了自己项目里的一些逻辑,凑合看吧 bool ProtocolPanel::eventFilter(QObject *obj, QEvent *event) { if((event->type() == QEvent::FocusIn)) { if(wFocusPrevious) // point to the widget that had focus last time { ProtocolLineEdit *pLineEdit = qobject_cast<ProtocolLineEdit*>(wFocusPrevious); if(pLineEdit) { if(ProtocolLineEdit::PauseEditType == pLineEdit->getLineEditType()) { if(storePauseTypeInputText(pLineEdit)) { wFocusPrevious = obj; return false; } else { pLineEdit->setFocus(); pLineEdit->selectAll(); return true; } } else { if(checkLineEditInput(pLineEdit)) { wFocusPrevious = obj; return false; } else { pLineEdit->setFocus(); pLineEdit->selectAll(); return true; } } } } } return QWidget::eventFilter(obj, event); }
feiyangqingyun 2017-05-18
  • 打赏
  • 举报
回复
除了遍历其他所有能输入的部件,调用setFocusPolicy(Qt::NoFocus);把其他控件的焦点屏蔽掉的方法; 还有一个转弯的方法,开一个定时器,定时300毫秒检测是否有部件输入错误,可以搞一个标志位,一旦有误,则始终对该部件setFocus即可。
zzwdkxx 2017-05-18
  • 打赏
  • 举报
回复
暂时还没想到更好的方法,先这样处理了。。。。

bool ProtocolManager::eventFilter(QObject *obj, QEvent *event)
{
    if((event->type() == QEvent::MouseButtonPress) )
    {
        //qDebug()<<"obj-----------------"<<obj;
        if(wFocusPrevious) // 该变量保存了上次焦点所在的部件
        {
            MyLineEdit *temp = qobject_cast<MyLineEdit*>(wFocusPrevious);
            if(temp)
            {
                int isValidValue = 0;
                //your function to check the value
                if(isValidValue )
                {
                    wFocusPrevious = obj;
                    return false;
                }
                else
                {
                    temp->setFocus();
                    temp->selectAll();
                    return true;
                }
            }
        }
        wFocusPrevious = obj;
    }

    return QWidget::eventFilter(obj, event);
}
zzwdkxx 2017-05-18
  • 打赏
  • 举报
回复
引用 1 楼 Kenier 的回复:
除了当前数值输入错误的QLineEdit,遍历其他所有能输入的部件,调用setFocusPolicy(Qt::NoFocus);把焦点屏蔽掉。亲测可用
这种方法效率太低了吧,并且通常是在切换到其他编辑框的时候,才检测原来的输入内容~
  • 打赏
  • 举报
回复
楼上正解,赞一个。
astro_lee 2017-05-17
  • 打赏
  • 举报
回复
除了当前数值输入错误的QLineEdit,遍历其他所有能输入的部件,调用setFocusPolicy(Qt::NoFocus);把焦点屏蔽掉。亲测可用

16,216

社区成员

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

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