zoukankan      html  css  js  c++  java
  • FocusInEvent()与FocusOutEvent()

    [2010年07月27日文档]

    描述:一开始我要实现的目的就是,在一个窗体上有多个可编辑控件(比如QLineEdit、QTextEdit等),当哪个控件获得焦点,哪个控件的背景就高亮用来起提示作用,查了下文档应该用focusInEvent()和focusOutEvent(), 在实际过程中,我犯了十分严重的错误,最开始的时候我是这样做的:我重写了窗体QWidget的这两个函数,然后再在函数体中把QFocusEvent事件传递给窗体上的QLineEdit控件:

    void Widget::focusInEvent(QFocusEvent *event)
    {
          QLineEdit::focusInEvent(event);
           .....
    }

    编译的时候报错,说是没有调用对象什么的,后来问了下朋友才得到了完美的答案:

    既然是要控件得到焦点改变动作,则应该重写该控件的focusInEvent()和focusOutEvent(),即重写QLineEdit类,再重新定义这两个处理函数,然后再在主程序中,include 我们自己重写的QLineEdit头文件,具体代码如下:

    // MYLINEEDIT_H
    #ifndef MYLINEEDIT_H
    #define MYLINEEDIT_H
    #include <QLineEdit>
    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
    `
    
    //myLineEdit.cpp
    #include "myLineEdit.h"
    
    MyLineEdit::MyLineEdit(QWidget *parent):QLineEdit(parent)
    {
    
    }
    
    MyLineEdit::~MyLineEdit()
    {
    
    }
    
    void MyLineEdit::focusInEvent(QFocusEvent *e)
    {
           QPalette p=QPalette();
           p.setColor(QPalette::Base,Qt::green);    //QPalette::Base 对可编辑输入框有效,还有其他类型,具体的查看文档
           setPalette(p);
    }
    
    void MyLineEdit::focusOutEvent(QFocusEvent *e)
    {
           QPalette p1=QPalette();
           p1.setColor(QPalette::Base,Qt::white);
           setPalette(p1);
    }
    `
    
    //widget.cpp
    #include "widget.h"
    #include "ui_widget.h"
    #include "MyLineEdit.h"
    #include <QGridLayout>
    #include <QMessageBox>
    Widget::Widget(QWidget *parent) :
                   QWidget(parent),
                   ui(new Ui::Widget)
    {
           ui->setupUi(this);
           init();
    }
    Widget::~Widget()
    {
           delete ui;
    }
    void Widget::init()
    {
           lineEdit1=new MyLineEdit(this);
           lineEdit2=new MyLineEdit(this);
           gridLayout=new QGridLayout;
           gridLayout->addWidget(lineEdit1,0,0);
           gridLayout->addWidget(lineEdit2,1,0);
           setLayout(gridLayout);
    }

    上图为程序范例,当某个文本框获得焦点后背景自动填充为绿色,失去焦点后背景恢复白色,这样就达到了我想要的焦点高亮背景提醒功能,但是实际分析想来还是很复杂的,假如我的程序还有QTextEdit、QSpinBox等等控件,那我还要全部都重写这些类,麻烦…我原本以为Qt提供了这种获得与失去焦点的信号,可惜没有,期待以后版本加上,就更加方便了…

  • 相关阅读:
    PAT 甲级 1051 Pop Sequence (25 分)(模拟栈,较简单)
    PAT 甲级 1050 String Subtraction (20 分) (简单送分,getline(cin,s)的使用)
    PAT 甲级 1049 Counting Ones (30 分)(找规律,较难,想到了一点但没有深入考虑嫌麻烦)***...
    PAT 甲级 1048 Find Coins (25 分)(较简单,开个数组记录一下即可)
    PAT 甲级 1047 Student List for Course (25 分)(cout超时,string scanf printf注意点,字符串哈希反哈希)...
    PAT 甲级 1046 Shortest Distance (20 分)(前缀和,想了一会儿)
    R语言实现金融数据的时间序列分析及建模
    ES6 | class类的基本语法总结
    less使用总结
    umi 的项目中如何修改 favicon
  • 原文地址:https://www.cnblogs.com/hicjiajia/p/2526768.html
Copyright © 2011-2022 走看看