C++ 如何知道QLineEdit是否获得焦点?

C++ 如何知道QLineEdit是否获得焦点?,c++,qt,qlineedit,C++,Qt,Qlineedit,我想知道在QLineEdit中是否有点击。所以我想我应该重新实现以下函数(??): 我该怎么做 另外,请告诉我如何使用focusInEvent()函数,以便了解QLineEdit myEdit对象获得焦点 编辑:我编写了以下函数: bool LoginDialog::eventFilter(QObject *target, QEvent *event) { if (target == m_passwordLineEdit) { if (event->type

我想知道在
QLineEdit
中是否有点击。所以我想我应该重新实现以下函数(??):

我该怎么做

另外,请告诉我如何使用
focusInEvent()
函数,以便了解
QLineEdit myEdit对象获得焦点

编辑:我编写了以下函数:

bool LoginDialog::eventFilter(QObject *target, QEvent *event)
{
    if (target == m_passwordLineEdit)
    {
        if (event->type() == QEvent::FocusIn)
        {
            if(checkCapsLock())
            {
                QMessageBox::about(this,"Caps Lock", "Your caps lock is ON!");

            }
            return true;

        }
    }
    return QDialog::eventFilter(target, event);
}
并且在
LoginDialog
类构造函数中注册了
m_passwordLineEdit
,如下所示:

m_passwordLineEdit->installEventFilter(this);
它正落入一个无限的MessageBox循环中。请帮我解决这个问题。实际上,我想用一个弹出窗口(而不是
QMessageBox
)来实现这个函数。可以使用
QLabel
满足这种需要吗?

类似的内容:

class YourWidget : public QLineEdit
{
    Q_OBJECT

    protected:

    void focusInEvent(QFocusEvent* e);
};
.cpp
文件中:

void YourWidget::focusInEvent(QFocusEvent* e)
{
    if (e->reason() == Qt::MouseFocusReason)
    {
      // The mouse trigerred the event
    }

    // You might also call the parent method.
    QLineEdit::focusInEvent(e);
}

您可以找到所有可能原因的列表。

如果您想知道有人何时单击小部件,您应该覆盖
mousePressEvent(QMouseEvent*event)
。除鼠标点击外,还可以通过其他来源触发
聚焦事件

例如:

class MyLineEdit : public QLineEdit
{
        Q_OBJECT
    public:
        //...
    protected:
         void mousePressEvent(QMouseEvent* event)
         {
              //pass the event to QLineEdit
              QLineEdit::mousePressEvent(event);
              //register the click or act on it
         }
};
如果您确实想知道您的小部件何时接收到焦点,当然也可以使用
focusInEvent
进行同样的操作

另外,请告诉我如何使用 focusInEvent()函数,以便 了解QLineEdit是否为myEdit;对象得到 专注

您应连接到以下信号:

void QApplication::focusChanged ( QWidget * old, QWidget * now )   [signal]
当新的QWidget是您的QLineEdit时,您知道它得到了关注


希望有帮助

如果他想知道点击是否集中在小部件上,这样做是不安全的。“不安全”可能确实太多了;)我的意思是,一些小部件可能会触发mousePressEvent(),但仍然无法获得焦点。但你明白我的意思。啊,我不知道那个信号。这非常有用,因为您不必继承小部件就可以覆盖
focusInEvent
!缺点是您必须对应用程序中的每个焦点更改做出反应。仍然值+1这太过分了。我认为这应该是一个更好的方法。不管怎样,谢谢。用Python怎么做?我不想为过滤器构建一个自定义类,然后将其安装为
QLineEdit.installEventFilter(CustomeFilterClass)
为了不编写子类,我想用bool eventFilter(QObject*target,QEvent*event)实现。已经编写了以下代码:bool LoginDialog::eventFilter(QObject*target,QEvent*event){if(target==m_passwordLineEdit){if(event->type()==QEvent::FocusIn){if(checkCapsLock()){QMessageBox::about(这个,“Caps Lock”,“你的Caps Lock打开了!”);}return true;}}return QDialog::eventFilter(target,event);}我陷入了MessageBox es的无限循环中:(这是因为当显示消息框时,您的
m_passwordLineEdit
将失去焦点,而当此框关闭时,您将再次获得焦点,从而导致再次显示该框,…我建议显示一些永久性消息(例如在您的行编辑下方)当Caps Lock处于启用状态时,即使它没有焦点。@Narek:Job对您面临的行为给出了正确的解释。添加一条永久消息(红色
QLabel
)并根据caps lock键的状态显示或隐藏它。请注意,在您的
QLineEdit
仍处于焦点状态时按caps lock键不会触发
focusInEvent()
。您也必须处理这种情况。
void QApplication::focusChanged ( QWidget * old, QWidget * now )   [signal]