一般说只在button中点击获得事件,作出相应的反应。而往往需要在QLabel上作出点击和触碰的效果。
我用qlabel做出了一个效果,当鼠标碰到label区域,label底下出现一条线,离开后线条消失。当点击label后变颜色
以下是我的代码
// label.h
#include <QLabel>
class label :public QLabel
{
Q_OBJECT
public:
explicit label(QString str,QWidget *parent = 0);
virtual void mousePressEvent(QMouseEvent *event);
void mouseReleaseEvent(QMouseEvent *event);
void enterEvent(QEvent *);
void leaveEvent(QEvent *);
int count;
void paintEvent(QPaintEvent *event);
bool over;
bool press;
signals:
//自定义clicked()信号,在mousePressEvent事件发生时触发
void clicked();
public slots:
void change_color();
};
//label.cpp
#include "label.h"
#include <QMouseEvent>
#include <QPainter>
#include <QPalette>
label::label(QString str,QWidget *parent) :
QLabel(parent)
{
QPalette palette;
palette.setColor(QPalette::WindowText,QColor(50,255,255));
this->setText(str);
this->setPalette(palette);
setAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
// this->setStyleSheet("background-color:blue");
this->setCursor(Qt::PointingHandCursor);
count = 0;
press = false;
over = false;
connect(this,SIGNAL(clicked()),this,SLOT(change_color()));
}
void label::mousePressEvent(QMouseEvent *event)
{
//如果单击了就触发clicked信号
if (event->button() == Qt::LeftButton)
{
//触发clicked信号
count++;
press = true;
emit clicked();
}
//将该事件传给父类处理
QLabel::mousePressEvent(event);
}
void label:: mouseReleaseEvent(QMouseEvent *event)
{
press = false;
update();
}
void label::enterEvent(QEvent *)
{
over =true;
update();
}
void label::leaveEvent(QEvent *)
{
over = false;
update();
}
void label::change_color()
{
if(count%2)
this->setStyleSheet("background-color:red");
else
this->setStyleSheet("background-color:blue");
}
void label::paintEvent(QPaintEvent *event)
{
QPainter paint(this);
paint.setPen(QPen(Qt::yellow,1));
if(over)
{
paint.drawLine(5,this->height()-5,this->width()-5,this->height()-5);
}
else
{
paint.setPen(Qt::NoPen);
}
QLabel::paintEvent(event);
}
//MainWindow.h
#include <QWidget>#include "label.h"class MainWindow : public QWidget{Q_OBJECT
public:
label *la;explicit MainWindow(QWidget *parent = 0);~MainWindow();};
//MainWindow.cpp
#include "mainwindow.h"#include <QLabel>MainWindow::MainWindow(QWidget *parent) :QWidget(parent){setFixedSize(200,100);la =new label("192.168.199.245",this);la->setGeometry(50,30,100,30);}MainWindow::~MainWindow(){}
//main.cpp
#include "mainwindow.h"#include <QApplication>int main(int argc, char *argv[]){QApplication a(argc, argv);MainWindow w;w.show();
return a.exec();}
仅供初学者参考