c++ - Qt focusInEvent() 只为键盘获取焦点

标签 c++ qt

我想将焦点放在 QLineEdit 控件上。为此,我在我的子类控件中重新实现了 focusInEvent。问题是,它只适用于键盘对焦,也就是。使用制表符。如果我用鼠标单击它或点击它(因为它是一个嵌入式应用程序),它似乎根本不会捕获事件。

我已经尝试设置 focusPolicy 但没有成功。

.cpp 文件:

#include "foolineedit.h"
#include "ui_foolineedit.h"
#include <QDebug>
#include <QFocusEvent>

fooLineEdit::fooLineEdit(QWidget *parent) :
    QLineEdit(parent),
    ui(new Ui::fooLineEdit)
{
    ui->setupUi(this);
    this->setFocusPolicy(Qt::ClickFocus);
}

fooLineEdit::~fooLineEdit()
{
    delete ui;
}

void fooLineEdit::focusInEvent(QFocusEvent *e)
{
    qDebug() << e->reason();
    QLineEdit::focusInEvent(e);
    emit(focused(true));
}

.h文件:

#include <QWidget>
#include <QLineEdit>

namespace Ui {
class fooLineEdit;
}

class fooLineEdit : public QLineEdit
{
    Q_OBJECT

public:
    explicit fooLineEdit(QWidget *parent = 0);
    ~fooLineEdit();
signals:
    void focused(bool hasFocus);
protected:
    virtual void focusInEvent(QFocusEvent *e);
private:
    Ui::fooLineEdit *ui;
};

关于我做错了什么有什么想法吗?


编辑:

因为在评论中提到了,所以我添加了 ui header 的代码 list

ui_foolineedit.h

class Ui_fooLineEdit
{
public:
    QLineEdit *lineEdit;

    void setupUi(QWidget *fooLineEdit)
    {
        if (fooLineEdit->objectName().isEmpty())
            fooLineEdit->setObjectName(QStringLiteral("fooLineEdit"));
        fooLineEdit->resize(151, 21);
        lineEdit = new QLineEdit(fooLineEdit);
        lineEdit->setObjectName(QStringLiteral("lineEdit"));
        lineEdit->setGeometry(QRect(0, 0, 151, 21));
        lineEdit->setFocusPolicy(Qt::ClickFocus);

        retranslateUi(fooLineEdit);

        QMetaObject::connectSlotsByName(fooLineEdit);
    } // setupUi

    void retranslateUi(QWidget *fooLineEdit)
    {
        fooLineEdit->setWindowTitle(QApplication::translate("fooLineEdit", "Form", Q_NULLPTR));
    } // retranslateUi

};

namespace Ui {
    class fooLineEdit: public Ui_fooLineEdit {};
} // namespace Ui

最佳答案

你基本上添加了一个

QLineEdit *lineEdit;

到您的 fooLineEdit,这又只是另一个 QLineEdit

这发生在 setupUi 中:

lineEdit = new QLineEdit(fooLineEdit);

我认为这足以把事情搞砸(fooLineEdit 的事件处理程序永远等待一个很可能发生在 inner 内部的事件QLineEdit).

尝试在不使用 ui 的情况下实现 QLineEdit 子类。

标题:

class fooLineEdit : public QLineEdit
{
    Q_OBJECT

public:
    explicit fooLineEdit(QWidget *parent = 0);
signals:
    void focused(bool hasFocus);
protected:
    virtual void focusInEvent(QFocusEvent *e);
};

来源:

fooLineEdit::fooLineEdit(QWidget *parent) :
    QLineEdit(parent)
{
    this->setFocusPolicy(Qt::ClickFocus);
}
void fooLineEdit::focusInEvent(QFocusEvent *e)
{
    qDebug() << e->reason();
    QLineEdit::focusInEvent(e);
    emit(focused(true));
}

看看问题是否解决了。

关于c++ - Qt focusInEvent() 只为键盘获取焦点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48767508/

相关文章:

c++ - 编译器是否按照您编写它们的相同顺序放置 && 语句的子句?

c++ - struct 中的默认值和构造函数顺序

c++ - 在 Qt-Projekt 中加载 libavcodec

C++20 概念检查类似元组的类型

qt - Qt 的样式表性能命中

qt - 在上下文管理方面,QFile.open() 的行为与 Python 的 open() 类似吗?

c++ - 检查迭代器是否对 QT 容器有效

c++ - 在字符串中添加逗号

C++ Friend 方法无法从类访问私有(private)数据

c++ - 共享库中的 D 指针和组合类