QT LineEdit和TextEdit 在信号里没有获得焦点和失去焦点的信号,这使得在编程时想要在失去焦点时有相应的处理动作成为一个难点。解决办法就是自己继承相应的QT LineEdit和TextEdit 类添加信号,同时重写对应得两个函数:
virtual void focusInEvent(QFocusEvent *event);
virtual void focusOutEvent(QFocusEvent *event) ;
在QT LineEdit和TextEdit 的类里这两个函数是虚函数,所以重写这两个函数属于覆盖。关于函数的重载,覆盖,隐藏等请参照:http://blog.csdn.net/xingyu19871124/article/details/7640131
这里说一下我的应用:我使用QT的 QTextEdit 想在他失去焦点后将字符串值传给一个lable。
但是下编程时发现,QT 的QTextEdit 没有这个失去焦点的信号。自然就不能关联槽函数。于是就打算自己写一个TextEdit 继承QTextEdit,添加失去焦点的信号。
头文件
#ifndef MYTEXTEDIT_H
#define MYTEXTEDIT_H
#include <QTextEdit>
class MyTextEdit : public QTextEdit
{
Q_OBJECT
public:
explicit MyTextEdit(QWidget *parent = 0);
void focusInEvent(QFocusEvent *event); //覆盖这两个函数
void focusOutEvent(QFocusEvent *event);
public slots:
void Slot_GetFocus();
void Slot_LostFocus(QString*);
signals:
void GetFocus(); //获得焦点信号
void LostFocus(QString* ); //失去焦点信号
private:
};
#endif // MYTEXTEDIT_H
实现cpp:
#include "MyTextEdit.h"
MyTextEdit::MyTextEdit(QWidget *parent) : QTextEdit(parent)
{
this->setFocusPolicy(Qt::StrongFocus);
//resize(parent->width(),parent->height());
}
void MyTextEdit::focusInEvent(QFocusEvent *event)
{
emit Slot_GetFocus();
}
void MyTextEdit::focusOutEvent(QFocusEvent *event)
{
emit Slot_LostFocus(this->toPlainText());
}
void MyTextEdit::Slot_GetFocus()
{
}
void MyTextEdit::Slot_LostFocus(QString*)
{
}
然后在Mainwindows中定义了两个MyTextEdit对象
MyTextEdit* mp_TextEdit;
MyTextEdit* mp_TextEdit2;
运行如图:
发现 点击的时候光标不见了,在网上找了很多相关的文章看都没能解决。后面就在帮助文档中看到了关于:
focusInEvent(QFocusEvent *event) 的介绍。然后我就在想既然我继承QTextEdit类,有光标,并且这个光标是在获得焦点后出现的,那么QTextEdit坑定在获得焦点后有处理,于是跟踪到QTextEdit类的头文件中,看到自由两个虚函数:
virtual void focusInEvent(QFocusEvent *event);
virtual void focusOutEvent(QFocusEvent *event) ;
具体实现不可见。 不可见就不可见吧!那我就直接调用吧!
将函数 void
MyTextEdit::focusInEvent(QFocusEvent *event);更改如下:
然后运行:
光标是出来了,但是两个框都有光标在闪烁。百度一下说:要在失去焦点时清除焦点
this->clearFocus();
试了没用。同时灵光一闪。
MyTextEdit::focusInEvent(QFocusEvent *event)调用了父类的,为何
MyTextEdit::focusOutEvent(QFocusEvent *event)不能调用呢?
然后运行,哈哈 完美解决。希望给予大家启发。
基于环境:win10 +QT5.6 +mingw49_32.