Qt QLineEdit QLabel添加clicked事件,给控件添加事件方法

Qt QLineEdit QLabel添加clicked事件,给控件添加事件方法

https://blog.csdn.net/lazzy_seed/article/details/41799233

转载 2014年12月08日 08:17:01

本文链接地址: Qt QLineEdit QLabel添加clicked事件

 

小编温馨提醒:以下内容有纯属参考,大概率会出现信号没有传递的问题

                          接下来给大家一个简单的发送信号的方式

做Qt开发的会知道QLineEdit,QLabel是默认没有clicked事件的,但是Qt有很好的一套信号/槽机制,而且Qt是基于C++面向对象的思想来设计的,那么我们就很容易通过自己定义一些类,重写QLineEdit或者QLabel的一些方法去实现没有的方法,比如clicked事件.本人就以QLineEdit QLabel添加clicked事件来说明.

Qt里面有个关键字emit,这个关键字意思就是触发一个信号,具体emit更详细的使用方法,可以百度,本文不做具体详解,只需知道emit是触发一个信号的方法即可.

下面我们就开始讲如何给QLineEdit添加clicked()事件.首先我们需要一个类,继承QLineEdit,我们定义为:mylineedit.那么分析下clicked()事件,这个事件是因为我们鼠标单击点击了下lineedit,然后触发的,那么正好,我们想到了在Qt有个mousePressEvent事件,于是我们可以重写mousePressEvent事件,然后触发自定义一个clicked()的信号,这样就可以实现点击lineedit就会发送一个clicked()的信号,代码如下:

mylineedit.h

 

[cpp] view plain copy
 
  1. #ifndef MYLINEEDIT_H  
  2. #define MYLINEEDIT_H  
  3.    
  4. #include <QLineEdit>  
  5. #include <QMouseEvent>  
  6.    
  7. class mylineedit : public QLineEdit  
  8. {  
  9.     Q_OBJECT  
  10. public:  
  11.     explicit mylineedit(QWidget *parent = 0);  
  12. protected:  
  13.     //重写mousePressEvent事件  
  14.     virtual void mousePressEvent(QMouseEvent *event);  
  15.    
  16. signals:  
  17.     //自定义clicked()信号,在mousePressEvent事件发生时触发  
  18.     void clicked();  
  19.    
  20. public slots:  
  21.    
  22. };  
  23.    
  24. #endif // MYLINEEDIT_H  

 

mylineedit.cpp
[cpp] view plain copy
 
  1. #include "mylineedit.h"  
  2.    
  3. mylineedit::mylineedit(QWidget *parent) :  
  4.     QLineEdit(parent)  
  5. {  
  6. }  
  7.    
  8. //重写mousePressEvent事件,检测事件类型是不是点击了鼠标左键  
  9. void mylineedit::mousePressEvent(QMouseEvent *event) {  
  10.     //如果单击了就触发clicked信号  
  11.     if (event->button() == Qt::LeftButton) {  
  12.         //触发clicked信号  
  13.         emit clicked();  
  14.     }  
  15.     //将该事件传给父类处理  
  16.     QLineEdit::mousePressEvent(event);  
  17. }  

通过以上代码,我们的lineedit已经具有了发出clicked信号的能力,那么我们就可以把他做为一个组件放到QWidget或者其他容器里面,在QWidget类里面我们提供一个处理lineedit clicked信号的槽函数,然后在QWidget构造函数里面绑定lineedit clicked信号跟对应的处理函数,这样就可以达到我们想要的效果.
 
widget.h
[cpp] view plain copy
 
  1. #ifndef WIDGET_H   
  2. #define WIDGET_H   
  3.     
  4. #include <QWidget>   
  5.     
  6. namespace Ui {   
  7.     class Widget;   
  8. }   
  9.     
  10. class Widget : public QWidget   
  11. {   
  12.     Q_OBJECT   
  13.     
  14. public:   
  15.     explicit Widget(QWidget *parent = 0);   
  16.     ~Widget();   
  17.     
  18. private:   
  19.     Ui::Widget *ui;   
  20.     
  21. private slots:   
  22.     //定义槽函数处理lineedit clicked   
  23.     void handlelineeditclicked();   
  24.     void handlelabelclicked();   
  25. };   
  26.     
  27. #endif // WIDGET_H  
 
 
widget.cpp
[cpp] view plain copy
 
  1. #include "widget.h"  
  2. #include "ui_widget.h"  
  3.    
  4. Widget::Widget(QWidget *parent) :  
  5.     QWidget(parent),  
  6.     ui(new Ui::Widget)  
  7. {  
  8.     ui->setupUi(this);  
  9.     //在widget的构造函数绑定lineedit的clicked信号  
  10.     connect(ui->lineEdit, SIGNAL(clicked()), this, SLOT(handlelineeditclicked()));  
  11.     connect(ui->label, SIGNAL(clicked()), this, SLOT(handlelabelclicked()));  
  12. }  
  13.    
  14. Widget::~Widget()  
  15. {  
  16.     delete ui;  
  17. }  
  18.    
  19. void Widget::handlelineeditclicked() {  
  20.     //在处理lineedit clicked函数里我们将lineedit背景色变为红色  
  21.     ui->lineEdit->setStyleSheet("background-color:red");  
  22. }  
  23.    
  24. void Widget::handlelabelclicked() {  
  25.     ui->label->setStyleSheet("background-color:green");  
  26. }  


运行之后的效果就是点击lineedit,然后lineedit背景变为红色.同理,QLabel增加clicked功能也可以实现了.效果如下:


注:(本人观点)最后好像有个错误!但这思路是可以有的,也是挺好的,仅供参考!
 
posted @ 2018-04-13 17:53  sky20080101  阅读(422)  评论(0)    收藏  举报