QT QLineEdit 获取焦点/获取焦点后全选字符
2016-05-23 21:11
711 查看
为了实现 QLineEdit 获取焦点/获取焦点后全选字符的功能,在网上先查了 QLineEdit 获取焦点的方法,有两种:
1 此方法只有在窗体从失去焦点到获取焦点时有作用:即窗体失去焦点后再次获取焦点时,将焦点置于某个 QLineEdit 中。
此功能明显不是偶想要的!!! 但由于网上现有的文章都是一样的,说的不是很清楚,所以只有试了才知道。
有三段代码:
1) 在窗体初始化时增加如下代码:
2) 在窗体的 .h 文件中声明 SLOT,如下:
3) 实现的代码
2 继承 QLineEdit, 再实现如下两个 SIGNAL:
virtual void focusInEvent(QFocusEvent *e);
virtual void focusOutEvent(QFocusEvent *e);
1) 继承类的声明:
2) 继承类的实现:
3) 使用 MyLineEdit 类定义控件,并完成布局。
测试运行发现,3) 中定义的控件随着焦点的获取/失去颜色会发生变化,但全选字符串的功能却无效!
但如果在如下代码:
放在一个按键的 Clicked 槽中就可以实现全选字符串的功能。 为什么无效呢???原因不知道,想到的区别就是同样的代码,一个是在 MainWindow 中、而另一个是在 myLineEdit 中。
试着将 Focus Get/Lost 动作放到 MainWindow 中响应:通过 SIGNAL/SLOT 来实现。 1) 在继承类的声明中增加如下代码:
2) 在继承类实现的 void MyLineEdit::focusInEvent(QFocusEvent *e) 函数中增加如下代码:
3) 在 MainWindow 的 .h 文件中增加如下代码:
4) 在 MainWindow 的源代码中增加如下代码:
但发现一样无法实现全选控件中字符串的功能。 无语......
最后无奈下想到延时一下,再做全选的动作。修改上述第四步的代码如下:
和延时超时的处理函数:
发现这样全选控件中文符串的功能竟然实现了!!!
在实现上述功能时,遇到的第一个问题其实不是代码,而不是 Layout 的问题: 之前所有控件是“拖”出来的,然后进行了 Layout 处理。忽然发现按上述修改,使用 MyLineEdit 类定义的第个控件是在代码中定义的,无法像之前一样“拖”到窗体中、并完成 Layout! 还好 QT 的代码 Layout 功能比较强大。最后两者结合才完成了想要的窗体 Layout。
1 此方法只有在窗体从失去焦点到获取焦点时有作用:即窗体失去焦点后再次获取焦点时,将焦点置于某个 QLineEdit 中。
此功能明显不是偶想要的!!! 但由于网上现有的文章都是一样的,说的不是很清楚,所以只有试了才知道。
有三段代码:
1) 在窗体初始化时增加如下代码:
// QLineEdit 获取焦点 1 - 此方法错误: 只有在窗体从失去焦点到获取焦点时有作用 ui->ledSendStr->installEventFilter(this); ui->ledSendFile->installEventFilter(this); ui->ledSendPreTime->installEventFilter(this);
2) 在窗体的 .h 文件中声明 SLOT,如下:
public slots: bool eventFilter(QObject *,QEvent *); // QLineEdit 获取焦点 2
3) 实现的代码
// QLineEdit 获取焦点 3 bool MainWindow::eventFilter(QObject *watched, QEvent *event) { if(watched == ledSendStr) { if(QEvent::FocusIn == event->type()) { qDebug() << "focus in"; ledSendStr->selectAll(); // 不起使用,只有在窗体获取到焦点时才有功能 ledSendStr->setFocus(Qt::OtherFocusReason); } else if(QEvent::FocusOut == event->type()) { qDebug() << "focus out"; } } else if(watched == ledSendFile) { } else if(watched == ledSendPreTime) { } return QWidget::eventFilter(watched,event); // 最后将事件交给上层对话框 }
2 继承 QLineEdit, 再实现如下两个 SIGNAL:
virtual void focusInEvent(QFocusEvent *e);
virtual void focusOutEvent(QFocusEvent *e);
1) 继承类的声明:
#ifndef MYLINEEDIT_H #define MYLINEEDIT_H #include <QLineEdit> #include <QDebug> class MyLineEdit: public QLineEdit { Q_OBJECT public: MyLineEdit(QWidget *parent=0); ~MyLineEdit(); protected: virtual void focusInEvent(QFocusEvent *e); virtual void focusOutEvent(QFocusEvent *e); }; #endif // MYLINEEDIT_H
2) 继承类的实现:
#include "myLineEdit.h" MyLineEdit::MyLineEdit(QWidget *parent):QLineEdit(parent) { } MyLineEdit::~MyLineEdit() { } void MyLineEdit::focusInEvent(QFocusEvent *e) { // qDebug() << "*MyLineEdit::focusInEvent" << this->objectName(); QPalette pGreen = QPalette(); pGreen.setColor(QPalette::Base,Qt::gray); //QPalette::Base 对可编辑输入框有效,还有其他类型,具体的查看文档 setPalette(pGreen); ledSendStr->selectAll(); // 不起使用,只有在窗体获取到焦点时才有功能 ledSendStr->setFocus(Qt::OtherFocusReason); } void MyLineEdit::focusOutEvent(QFocusEvent *e) { // qDebug() << "*MyLineEdit::focusOutEvent" << this->objectName(); QPalette pWhite = QPalette(); pWhite.setColor(QPalette::Base,Qt::white); setPalette(pWhite); }
3) 使用 MyLineEdit 类定义控件,并完成布局。
测试运行发现,3) 中定义的控件随着焦点的获取/失去颜色会发生变化,但全选字符串的功能却无效!
但如果在如下代码:
ledSendStr->selectAll(); ledSendStr->setFocus(Qt::OtherFocusReason);
放在一个按键的 Clicked 槽中就可以实现全选字符串的功能。 为什么无效呢???原因不知道,想到的区别就是同样的代码,一个是在 MainWindow 中、而另一个是在 myLineEdit 中。
试着将 Focus Get/Lost 动作放到 MainWindow 中响应:通过 SIGNAL/SLOT 来实现。 1) 在继承类的声明中增加如下代码:
signals: void selectAllWhenFocus(QString strCtrlName);
2) 在继承类实现的 void MyLineEdit::focusInEvent(QFocusEvent *e) 函数中增加如下代码:
emit selectAllWhenFocus(this->objectName());
3) 在 MainWindow 的 .h 文件中增加如下代码:
public slots: void selectAllWhenFocusSlot(QString strCtrlName);
4) 在 MainWindow 的源代码中增加如下代码:
void MainWindow::selectAllWhenFocusSlot(QString strCtrlName) { // qDebug() << "Main Windows: " << strCtrlName; ledSendStr->selectAll(); ledSendStr->setFocus(Qt::OtherFocusReason); }
但发现一样无法实现全选控件中字符串的功能。 无语......
最后无奈下想到延时一下,再做全选的动作。修改上述第四步的代码如下:
void MainWindow::selectAllWhenFocusSlot(QString strCtrlName) { // qDebug() << "Main Windows: " << strCtrlName; m_strCtrlName = strCtrlName; if(NULL != m_timerDelaySelect) { if(m_timerDelaySelect->isActive()) { m_timerDelaySelect->stop(); } delete m_timerDelaySelect; m_timerDelaySelect = NULL; } m_timerDelaySelect = new QTimer(this); //新建定时器 connect(m_timerDelaySelect,SIGNAL(timeout()),this,SLOT(timerUpDateSeleceAll())); m_timerDelaySelect->start(200); }
和延时超时的处理函数:
void MainWindow::timerUpDateSeleceAll() { if(m_strCtrlName == "ledSendPreTime") { ledSendPreTime->selectAll(); ledSendPreTime->setFocus(Qt::OtherFocusReason); } else if(m_strCtrlName == "ledSendStr") { ledSendStr->selectAll(); ledSendStr->setFocus(Qt::OtherFocusReason); } else if(m_strCtrlName == "ledSendFile") { ledSendFile->selectAll(); ledSendFile->setFocus(Qt::OtherFocusReason); } if(NULL != m_timerDelaySelect) { if(m_timerDelaySelect->isActive()) { m_timerDelaySelect->stop(); } delete m_timerDelaySelect; m_timerDelaySelect = NULL; } }
发现这样全选控件中文符串的功能竟然实现了!!!
在实现上述功能时,遇到的第一个问题其实不是代码,而不是 Layout 的问题: 之前所有控件是“拖”出来的,然后进行了 Layout 处理。忽然发现按上述修改,使用 MyLineEdit 类定义的第个控件是在代码中定义的,无法像之前一样“拖”到窗体中、并完成 Layout! 还好 QT 的代码 Layout 功能比较强大。最后两者结合才完成了想要的窗体 Layout。
相关文章推荐
- Qt学习笔记
- Qt中文手册 之 QTableWidget
- Qt中文手册 之 QHeaderView
- 转:XMPP协议、MQTT协议、HTTP协议、CoAP协议的基本比较
- qt treewidget 的模糊查询
- 解决Ubuntu环境下vim和QT中文输入问题
- ros-Qt代码环境的搭建
- Qt新建工程
- Qt布局
- Qt类图
- Qt简介
- qt qtabwidget tab美化
- Qt第三方库----QCustomPlot
- QT使用笔记
- 交叉编译nanopi QT+QWT界面的流程和问题
- Qt客户端自定义外观(一)
- Qt Serial Port
- QThread QT线程使用案例
- QThread中的互斥、读写锁、信号量、条件变量
- qtip的使用实例