精华内容
下载资源
问答
  • 解决方法: tmpEd->setDisabled(false); tmpEd->setFocusPolicy(Qt::ClickFocus); tmpEd->setReadOnly(true);

    在这里插入图片描述
    解决方法:
    tmpEd->setDisabled(false);
    tmpEd->setFocusPolicy(Qt::ClickFocus);
    tmpEd->setReadOnly(true);

    展开全文
  • QLineEdit 获取焦点/获取焦点后全选字符的功能,在网上先查了 QLineEdit 获取焦点的方法,有两种:1 此方法只有在窗体从失去焦点到获取焦点时有作用:即窗体失去焦点后再次获取焦点时,将焦点置于某个 QLineEdit 中...

    为了实现  QLineEdit 获取焦点/获取焦点后全选字符的功能,在网上先查了 QLineEdit 获取焦点的方法,有两种:
    1 此方法只有在窗体从失去焦点到获取焦点时有作用:即窗体失去焦点后再次获取焦点时,将焦点置于某个 QLineEdit 中。
     此功能明显不是偶想要的!!! 但由于网上现有的文章都是一样的,说的不是很清楚,所以只有试了才知道。
    有三段代码:
    1) 在窗体初始化时增加如下代码:

    1     // QLineEdit 获取焦点 1 - 此方法错误: 只有在窗体从失去焦点到获取焦点时有作用
    2     ui->ledSendStr->installEventFilter(this);
    3     ui->ledSendFile->installEventFilter(this);
    4     ui->ledSendPreTime->installEventFilter(this);

    2) 在窗体的 .h 文件中声明 SLOT,如下:

    1 public slots:
    2     bool eventFilter(QObject *,QEvent *);       // QLineEdit 获取焦点 2

    3) 实现的代码

     1 // QLineEdit 获取焦点 3
     2 bool MainWindow::eventFilter(QObject *watched, QEvent *event)
     3 {
     4     if(watched == ledSendStr)
     5     {
     6         if(QEvent::FocusIn == event->type())
     7         {
     8             qDebug() << "focus in";
     9             ledSendStr->selectAll();        // 不起使用,只有在窗体获取到焦点时才有功能
    10             ledSendStr->setFocus(Qt::OtherFocusReason);
    11         }
    12         else if(QEvent::FocusOut == event->type())
    13         {
    14             qDebug() << "focus out";
    15         }
    16     }
    17     else if(watched == ledSendFile)
    18     {
    19     }
    20     else if(watched == ledSendPreTime)
    21     {
    22     }
    23     return QWidget::eventFilter(watched,event);     // 最后将事件交给上层对话框
    24 }

     

    2 继承 QLineEdit, 再实现如下两个 SIGNAL:
      virtual void focusInEvent(QFocusEvent *e);
      virtual void focusOutEvent(QFocusEvent *e);

    1) 继承类的声明:

     1 #ifndef MYLINEEDIT_H
     2 #define MYLINEEDIT_H
     3 
     4 #include <QLineEdit>
     5 #include <QDebug>
     6 
     7 class MyLineEdit: public QLineEdit
     8 {
     9     Q_OBJECT
    10 
    11  public:
    12     MyLineEdit(QWidget *parent=0);
    13     ~MyLineEdit();
    14 
    15  protected:
    16     virtual void focusInEvent(QFocusEvent *e);
    17     virtual void focusOutEvent(QFocusEvent *e);
    18 };
    19 
    20 #endif // MYLINEEDIT_H

    2) 继承类的实现:

     1 #include "myLineEdit.h"
     2 
     3 MyLineEdit::MyLineEdit(QWidget *parent):QLineEdit(parent)
     4 {
     5 }
     6 
     7 MyLineEdit::~MyLineEdit()
     8 {
     9 }
    10 
    11 void MyLineEdit::focusInEvent(QFocusEvent *e)
    12 {
    13     // qDebug() << "*MyLineEdit::focusInEvent" << this->objectName();
    14 
    15     QPalette pGreen = QPalette();
    16     pGreen.setColor(QPalette::Base,Qt::gray);    //QPalette::Base 对可编辑输入框有效,还有其他类型,具体的查看文档
    17     setPalette(pGreen);
    18     
    19     ledSendStr->selectAll();        // 不起使用,只有在窗体获取到焦点时才有功能
    20     ledSendStr->setFocus(Qt::OtherFocusReason);
    21 }
    22 
    23 void MyLineEdit::focusOutEvent(QFocusEvent *e)
    24 {
    25     // qDebug() << "*MyLineEdit::focusOutEvent" << this->objectName();
    26 
    27     QPalette pWhite = QPalette();
    28     pWhite.setColor(QPalette::Base,Qt::white);
    29     setPalette(pWhite);
    30 }

    3) 使用 MyLineEdit 类定义控件,并完成布局。
    测试运行发现,3) 中定义的控件随着焦点的获取/失去颜色会发生变化,但全选字符串的功能却无效!
    但如果在如下代码:

    1 ledSendStr->selectAll();
    2 ledSendStr->setFocus(Qt::OtherFocusReason);

    放在一个按键的 Clicked 槽中就可以实现全选字符串的功能。 为什么无效呢???原因不知道,想到的区别就是同样的代码,一个是在 MainWindow 中、而另一个是在 myLineEdit 中。

    试着将 Focus Get/Lost 动作放到 MainWindow 中响应:通过 SIGNAL/SLOT 来实现。 1) 在继承类的声明中增加如下代码:

    1 signals:
    2     void selectAllWhenFocus(QString strCtrlName);

    2) 在继承类实现的 void MyLineEdit::focusInEvent(QFocusEvent *e) 函数中增加如下代码:

    1 emit selectAllWhenFocus(this->objectName());

    3) 在 MainWindow 的 .h 文件中增加如下代码:

    1 public slots:
    2     void selectAllWhenFocusSlot(QString strCtrlName);

    4) 在 MainWindow 的源代码中增加如下代码:

    1 void MainWindow::selectAllWhenFocusSlot(QString strCtrlName)
    2 {
    3     // qDebug() << "Main Windows: " << strCtrlName;
    4 
    5     ledSendStr->selectAll();
    6     ledSendStr->setFocus(Qt::OtherFocusReason);
    7 }

    但发现一样无法实现全选控件中字符串的功能。 无语......

    最后无奈下想到延时一下,再做全选的动作。修改上述第四步的代码如下:

     1 void MainWindow::selectAllWhenFocusSlot(QString strCtrlName)
     2 {
     3     // qDebug() << "Main Windows: " << strCtrlName;
     4 
     5     m_strCtrlName = strCtrlName;
     6     if(NULL != m_timerDelaySelect)
     7     {
     8         if(m_timerDelaySelect->isActive())
     9         {
    10             m_timerDelaySelect->stop();
    11         }
    12         delete m_timerDelaySelect;
    13         m_timerDelaySelect = NULL;
    14     }
    15     m_timerDelaySelect = new QTimer(this);
    16     //新建定时器
    17     connect(m_timerDelaySelect,SIGNAL(timeout()),this,SLOT(timerUpDateSeleceAll()));
    18     m_timerDelaySelect->start(200);
    19 }

    和延时超时的处理函数:

     1 void MainWindow::timerUpDateSeleceAll()
     2 {
     3     if(m_strCtrlName == "ledSendPreTime")
     4     {
     5         ledSendPreTime->selectAll();
     6         ledSendPreTime->setFocus(Qt::OtherFocusReason);
     7     }
     8     else if(m_strCtrlName == "ledSendStr")
     9     {
    10         ledSendStr->selectAll();
    11         ledSendStr->setFocus(Qt::OtherFocusReason);
    12     }
    13     else if(m_strCtrlName == "ledSendFile")
    14     {
    15         ledSendFile->selectAll();
    16         ledSendFile->setFocus(Qt::OtherFocusReason);
    17     }
    18 
    19     if(NULL != m_timerDelaySelect)
    20     {
    21         if(m_timerDelaySelect->isActive())
    22         {
    23             m_timerDelaySelect->stop();
    24         }
    25         delete m_timerDelaySelect;
    26         m_timerDelaySelect = NULL;
    27     }
    28 }

    发现这样全选控件中文符串的功能竟然实现了!!!

    在实现上述功能时,遇到的第一个问题其实不是代码,而不是 Layout 的问题: 之前所有控件是“拖”出来的,然后进行了 Layout 处理。忽然发现按上述修改,使用 MyLineEdit 类定义的第个控件是在代码中定义的,无法像之前一样“拖”到窗体中、并完成 Layout! 还好 QT 的代码  Layout 功能比较强大。最后两者结合才完成了想要的窗体 Layout。

     

    转载于:https://www.cnblogs.com/91program/p/5521420.html

    展开全文
  • 使用场景:在QTreeWidget或者QTableWidget中编辑完成一个item之后需要立即响应处理,也就是在item编辑之后,失去焦点之后完成处理,需要获取编辑框的失去焦点事件。 #pragma once #include <QLineEdit> #...

    使用场景:在QTreeWidget或者QTableWidget中编辑完成一个item之后需要立即响应处理,也就是在item编辑之后,失去焦点之后完成处理,需要获取编辑框的失去焦点事件。

    #pragma once
    
    #include <QLineEdit>
    #include <QString>
    
    //QTableWidget或者QTreeWidget中item的编辑框
    
    class ILineEditFocus;
    
    class LineEditItem : public QLineEdit {
    	Q_OBJECT
    
    public:
    	LineEditItem();
    	~LineEditItem();
    
    	void setFocusInterface(ILineEditFocus* focus);
    
    	void focusInEvent(QFocusEvent *e)override;
    	void focusOutEvent(QFocusEvent *e)override;
    
    private slots:
    	void slotEnterPreess();
    
    private:
    	QString _text;
    	ILineEditFocus* _focus = nullptr;
    };
    
    
    #include "LineEditItem.h"
    #include "CommonWidget\LineEditItem\ILineEditFocus.h"
    
    LineEditItem::LineEditItem() {
    	connect(this, SIGNAL(returnPressed()), this, SLOT(slotEnterPreess()));
    }
    
    LineEditItem::~LineEditItem() {
    }
    
    void LineEditItem::setFocusInterface(ILineEditFocus* focus) {
    	_focus = focus;
    }
    
    void LineEditItem::focusInEvent(QFocusEvent *e) {
    	QLineEdit::focusInEvent(e);
    	setStyleSheet("background-color:rgba(255,255,255,255); border:1px");
    	_text = text();
    	_focus->getFocus(_text);
    }
    
    void LineEditItem::focusOutEvent(QFocusEvent *e) {
    	QLineEdit::focusOutEvent(e);
    	setStyleSheet("background-color:rgba(255,255,255,0); border:none");
    	_text = text();
    	_focus->lostFocus(_text);
    }
    
    void LineEditItem::slotEnterPreess() {
    	QLineEdit::clearFocus();
    }
    
    

    回调接口

    #pragma once
    #include "../commonwidget_global.h"
    
    #include <QString>
    //编辑框焦点失去和得到的时候接口
    
    class ILineEditFocus {
    public:
    	ILineEditFocus();
    	~ILineEditFocus();
    
    	virtual void getFocus(QString text);
    	virtual void lostFocus(QString text);
    };
    
    #include "CommonWidget\LineEditItem\ILineEditFocus.h"
    
    ILineEditFocus::ILineEditFocus() {
    }
    
    ILineEditFocus::~ILineEditFocus() {
    }
    
    void ILineEditFocus::getFocus(QString text) {
    
    }
    
    void ILineEditFocus::lostFocus(QString text) {
    
    }
    
    

    封装类

    #pragma once
    #include "../commonwidget_global.h"
    
    //编辑框
    
    class LineEditItem;
    class ILineEditFocus;
    class QWidget;
    
    class COMMONWIDGET_EXPORT LineEdit {
    public:
    	LineEdit(ILineEditFocus* ilef);
    	~LineEdit();
    
    	QWidget* getLineEdit();
    private:
    	LineEditItem* _lineEditItem = nullptr;
    };
    
    
    
    #include "CommonWidget\LineEditItem\LineEdit.h"
    #include "LineEditItem.h"
    #include "CommonWidget\LineEditItem\ILineEditFocus.h"
    
    LineEdit::LineEdit(ILineEditFocus* ilef) {
    	_lineEditItem = new LineEditItem;
    	_lineEditItem->setFocusInterface(ilef);
    }
    
    LineEdit::~LineEdit() {
    
    }
    
    QWidget* LineEdit::getLineEdit() {
    	return _lineEditItem;
    }
    
    

    aaa

    展开全文
  • 如果我们希望在鼠标点击其它位置时,QLineEdit失去焦点,那就必须要设置事件过滤器evenFilter,捕捉到所有的鼠标点击事件。 代码如下: #include "mainwindow.h" #include "ui_mainwindow.h" #

    当主界面有一个QLineEdit被激活时,默认情况下,点击窗口的其它位置不会取消掉QLineEdit的激活状态(即QLineEdit仍然具有焦点),除非是点击按钮一类的控件。

    如图,无论怎么点击空白窗口处,QLineEdit会一直处于激活状态。

    如果我们希望在鼠标点击其它位置时,QLineEdit失去焦点,那就必须要设置事件过滤器evenFilter,捕捉到所有的鼠标点击事件。

    代码如下:

    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    #include <QLabel>
    #include <QLineEdit>
    
    MainWindow::MainWindow(QWidget *parent)
        : QMainWindow(parent)
        , ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
        ui->lineEdit->setFocusPolicy(Qt::ClickFocus);
    
        qApp->installEventFilter(this);  //为所有控件添加事件过滤器
    
    
    }
    MainWindow::~MainWindow()
    {
        delete ui;
    }
    
    bool MainWindow::eventFilter(QObject *watched, QEvent *event) {
        if(event->type() == QEvent::MouseButtonPress && watched !=  ui->lineEdit)
        {
             ui->lineEdit->clearFocus();
             this->setFocus();
        }
    }

    这时候在点击非lineEdit的控件或者窗口时,lineEdit将失去焦点,光标也随之消失。

    但是,如果在QLineEdit中使用了QCompleter补全,那么情况会变得复杂一些:

    如图,当下拉补全框出现以后,如果不选择它,直接点击其它位置,那么QLineEdit的闪烁光标仍然不会消失,这明显不符合我们的开发需求。

    这个问题也好解决,我们在clearFocus之前先setFocus就可以了。原因暂时不知道,或许是因为下拉框占据了焦点?????

    不过这样做仍然需要点击两次才能让光标消失,第一次只能让下拉框消失,不过这样也是正常的。

    代码如下:

    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    #include <QLabel>
    #include <QLineEdit>
    #include <QCompleter>
    
    MainWindow::MainWindow(QWidget *parent)
        : QMainWindow(parent)
        , ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
        ui->lineEdit->setFocusPolicy(Qt::ClickFocus);
        //添加 QCompleter
        QStringList word_list;
        word_list<<"Python"<<"Php"<<"C/C++"<<"C#";
        QCompleter *completer = new QCompleter(word_list, this);
        completer->setCaseSensitivity(Qt::CaseInsensitive);//忽略大小写
        ui->lineEdit->setCompleter(completer);
    
        qApp->installEventFilter(this);  //为所有控件添加事件过滤器
    
    
    }
    MainWindow::~MainWindow()
    {
        delete ui;
    }
    
    bool MainWindow::eventFilter(QObject *watched, QEvent *event) {
        if(event->type() == QEvent::MouseButtonPress && watched !=  ui->lineEdit)
        {
             ui->lineEdit->setFocus();
             ui->lineEdit->clearFocus();
             this->setFocus();
        }
        return QObject::eventFilter(watched,event);
    }

    这样其实还是可能会有一个问题:

    如图,在实际的项目中,由于用的控件比较多,比较复杂,如果只是简单的判断 watched是否等于QLineEdit,那么可能会出现这样的结果,这不是我们想要的。

    最万无一失的办法,判断鼠标点击的位置,是否处于QLineEdit中,如果不是,则去掉焦点:

    项目中部分代码如下:

     if(event->type() == QEvent::MouseButtonPress){
           QMouseEvent *mEvent = static_cast<QMouseEvent*>(event);
           QPoint mWindowGlobalPoint(this->mapToGlobal(QPoint(0,0)));
           QPoint mouseGlobalPoint(mEvent->globalPos());
           QPoint tPoint = mouseGlobalPoint - mWindowGlobalPoint;
           //qDebug()<<m_searchWidget->geometry()<<  mWindowGlobalPoint << mouseGlobalPoint << tPoint;
           if( !m_searchWidget->geometry().contains(tPoint) ){
                if(m_isSearching == true){
                    m_searchWidget->setFocus();
                    m_searchWidget->clearFocus();
                }
           }
       }

    注意:这里是要得到鼠标按下时在主窗口的位置,而不是父窗口的位置。我没有找到怎么直接获取在主窗口的位置,是通过全局位置进行计算得到的。

    这个计算好像有点问题,因为geometry是控件相对于父窗口的坐标。后来又发现了一种新的方式,可以获取到点击事件相对于控件父窗口的坐标,然后再判断鼠标相对于控件父窗口的位置是否在控件在其父窗口里面所占的位置即可:

    QMouseEvent *mEvent   = static_cast<QMouseEvent*>(event);
    QWidget *srcParent    = static_cast<QWidget*>(sourcePathLine->parent()); //得到sourcePathLine父窗口
    QWidget *inTextParent = static_cast<QWidget*>(inputText->parent());      //得到inputText父窗口
    QPoint  srcPoint      = srcParent   ->mapFromGlobal(mEvent->globalPos());//得到鼠标点击位置相对于父窗口坐标
    QPoint  inTextPoint   = inTextParent->mapFromGlobal(mEvent->globalPos());//得到鼠标点击位置相对于父窗口坐标
    if (!sourcePathLine->geometry().contains(srcPoint)) {
        sourcePathLine->deselect();
    }
    if (!inputText->geometry().contains(inTextPoint)) {
        QTextCursor cursor = inputText->textCursor();
        cursor.movePosition(QTextCursor::End);
        inputText->setTextCursor(cursor);
        }

     

    正常情况:

     

    展开全文
  • 要使用到过滤器 bool eventFilter(QObject *wcg, QEvent *event);//事件过滤 在使用之前要为控件安装事件过滤器 ui->lEt_Autograph->installEventFilter(this);...在bool eventFilter(QObject *wcg,...
  • 今天主要讨论如何使输入框失去焦点后键盘自动退出。 window 平板开发发现一个问题,当界面有输入框时,系统键盘弹出和隐藏不正确。 正常情况,进入界面输入框处于焦点状态,键盘弹出或者隐藏,点击输入框键盘弹出,...
  • 如题: 在通过键盘改变焦点到不同的QLineEdit上时获取到焦点的控件改变颜色,失去焦点后变回原来的颜色。我用eventFilter事件过滤没有效果,还有什么其他办法吗?
  • QLineEdit光标问题

    2021-04-20 13:42:36
    QLineEdit的光标当失去焦点后仍然显示的问题: 在lineedit和其它按钮之间切换焦点时,注意lineedit的设置有顺序,否则当失去焦点时仍有光标闪,或者得到焦点无光标。 使lineedit有效: lineedit->setEnabled ...
  • Qt获得焦点和失去焦点处理事件 (Focus事件)方法一:描述:一开始我要实现的目的就是,在一个窗体上有多个可编辑控件(比如QLineEdit、QTextEdit等),当哪个控件获得焦点,哪个控件的背景就高亮用来起提示作用,查...
  • m_pLineEdit->setEchoMode(QLineEdit::PasswordEchoOnEdit);//输入时显示数字,失去焦点时显示圆点 m_pLineEdit->setEchoMode(QLineEdit::Password);...
  • Qt获得和失去焦点事件(Focus事件)

    万次阅读 2018-05-03 00:12:44
    Qt获得和失去焦点事件(Focus事件)1.重写控件的focusInEvent()和focusOutEvent()函数针对一个窗口上的多个可编辑控件(比如QLineEdit、QTextEdit等),我们希望控件在获得焦点之后能够和其他的控件有区别,如果想实现这...
  • 描述:一开始我要实现的目的就是,在一个窗体上有多个可编辑控件(比如QLineEdit、QTextEdit等),当哪个控件获得焦点,哪个控件的背景就高亮用来起提示作用,查了下文档应该用focusInEvent()和focusOutEvent...
  • QLineEdit 信号函数总结

    万次阅读 多人点赞 2014-02-26 10:53:24
    QLineEdit一共有6个信号函数,并不多,很好理解。 · void cursorPositionChanged( int old, int new ) ...当 按返回或者回车键时,或者行编辑失去焦点时,发出此信号。 注意: 当QLineEdit设置了vali

空空如也

空空如也

1 2 3
收藏数 47
精华内容 18
关键字:

qlineedit失去焦点