我想将焦点放在 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/