码迷,mamicode.com
首页 > 其他好文 > 详细

QLabel添加clicked事件

时间:2015-08-13 13:52:06      阅读:6304      评论:0      收藏:0      [点我收藏+]

标签:

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

 

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

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

myLabel1.h

 

#ifndef MYLABEL1_
#define MYLABEL1_

#include <QLabel>
#include <QObject>
#include <QMouseEvent>
#include <QWidget>
#include <QDebug>
#include <QFileDialog>
#include <QMessageBox>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>

#include "struct.h"


class myLabel1 : public QLabel
{
Q_OBJECT
public:
myLabel1( QWidget * parent = 0 );
~myLabel1() {}

signals:
void clicked( bool, QString );
void mouseMoved( QString );

public slots:
void slotClicked( bool m_bLeftPress, QString accessibleDescription );
void slotmouseMoved( QString accessibleDescription );

protected:
void mousePressEvent ( QMouseEvent * event ) ;
void mouseMoveEvent( QMouseEvent * event );

private:
bool m_bLeftPress;

};

#endif

 

 

myLabel1.cpp

#include "myLabel1.h"

myLabel1::myLabel1( QWidget * parent )
:QLabel(parent)
{
m_bLeftPress = true;

setMouseTracking( true );
}

void myLabel1::slotClicked( bool, QString )
{
qDebug()<<"Clicked";
}

void myLabel1::slotmouseMoved( QString )
{
qDebug()<<"slotmouseMoved";
}

void myLabel1::mousePressEvent ( QMouseEvent * event )
{
// 如果单击了就触发clicked信号
if ( event->button() == Qt::LeftButton )
{
m_bLeftPress = true;
emit clicked( m_bLeftPress, this->accessibleDescription() );
}
else
{
m_bLeftPress = false;
emit clicked( m_bLeftPress, this->accessibleDescription() );
}

// 将该事件传给父类处理
QLabel::mousePressEvent(event);
}

void myLabel1::mouseMoveEvent( QMouseEvent * event )
{
emit mouseMoved( this->accessibleDescription() );

// 将该事件传给父类处理
QLabel::mouseMoveEvent(event);
}

 

通过以上代码,我们的myLabel1已经具有了发出clicked信号的能力,那么我们就可以把他做为一个组件放到QWidget或者其他容器里面(这部分内容可以在ui节目中将普通的label通过控件的提升而提升为myLabel1),在QWidget类里面我们提供一个处理myLabel1clicked信号的槽函数,然后在QWidget构造函数里面绑定myLabel1clicked信号跟对应的处理函数,这样就可以达到我们想要的效果.

widget.h

#ifndef WIDGET_H
#define WIDGET_H
 
#include <QWidget>
 
namespace Ui {
    class Widget;
}
 
class Widget : public QWidget
{
    Q_OBJECT
 
public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();
 
private:
    Ui::Widget *ui;
 
private slots:
    //定义槽函数处理lineedit clicked
    void handlelmyLabel1clicked();
    void handlelabelclicked();
};
 
#endif // WIDGET_H

 

 

 

widget.cpp

#include "widget.h"
#include "ui_widget.h"
 
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    //在widget的构造函数绑定lineedit的clicked信号
    connect(ui->myLabel1_1, SIGNAL(clicked()), this, SLOT(handlelineeditclicked()));
    connect(ui->myLabel1_2, SIGNAL(clicked()), this, SLOT(handlelabelclicked()));
}
 
Widget::~Widget()
{
    delete ui;
}
 
void Widget::handlelineeditclicked() {
    //在处理lineedit clicked函数里我们将lineedit背景色变为红色
    ui->lineEdit->setStyleSheet("background-color:red");
}
 
void Widget::handlelabelclicked() {
    ui->label->setStyleSheet("background-color:green");
}

 这样,我们的myLabel1便具有了clicked的功能了.

 

参考:http://www.jyguagua.com/?p=668

QLabel添加clicked事件

标签:

原文地址:http://www.cnblogs.com/txf1949/p/4726809.html

(0)
(1)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!