QT 为QPushButton、QLabel添加鼠标移入移出事件
**要实现的效果:**鼠标移入QPushButton时与移出时按钮变换字体颜色,鼠标移入QLabel时显示上面的文字,移出时不显示。
**方法:**由于Qt自带的QPushButton和QLabel没有鼠标事件这一属性,我们需要重新定义两个类别,分别继承自QPushButton和QLabel,然后在新的类别里面再重写鼠标移入移出事件。
下面我新建了一个名字是 a 的工程,然后在头文件和源文件里分别添加mybutton.h mylabel.h和mybutton.cpp mylabel.cpp,分别新定义了MyButton类和MyLabel类。
工程文件列表如下:
mybutton.h
#ifndef MYBUTTON_H
#define MYBUTTON_H
#include<QPushButton>
#include<QEvent>
class MyButton :public QPushButton
{
Q_OBJECT;
public:
MyButton(QWidget *parent = 0);
~MyButton();
public:
void enterEvent(QEvent *e); //鼠标进入事件
void leaveEvent(QEvent *e);//鼠标离开事件
};
#endif // MYBUTTON_H
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
mylabel.h
#ifndef MYLABEL_H
#define MYLABEL_H
#include<QLabel>
#include<QEvent>
class MyLabel :public QLabel
{
Q_OBJECT;
public:
MyLabel(QWidget *parent = 0);
~MyLabel();
public:
void enterEvent(QEvent *e);//鼠标进入事件
void leaveEvent(QEvent *e);//鼠标离开事件
};
#endif // MYLABEL_H
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include "mybutton.h"
#include "mylabel.h"
#include <QMainWindow>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
MyButton *button1, *button2;
MyLabel *myLabel;
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
mybutton.cpp
#include"mybutton.h"
MyButton::MyButton(QWidget* parent) :QPushButton(parent)
{
}
MyButton::~MyButton()
{
}
void MyButton::enterEvent(QEvent *e)
{
setStyleSheet("color:rgb(255,255,0)"); //设置背景颜色
}
void MyButton::leaveEvent(QEvent *e)
{
setStyleSheet("color:rgb(0,0,0)"); //设置背景颜色
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
mylabel.cpp
#include "mylabel.h"
MyLabel::MyLabel(QWidget* parent) :QLabel(parent)
{
}
MyLabel::~MyLabel()
{
}
void MyLabel::enterEvent(QEvent *e)
{
setText("Ok, mouse is on");
}
void MyLabel::leaveEvent(QEvent *e)
{
setText(" ");
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "mybutton.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
button1= new MyButton(this);
button2= new MyButton(this);
button1->setText("one");
button2->setText("two");
button1->setGeometry(QRect(200,200,80,30)); //设置位置和大小
button2->setGeometry(QRect(300,200,80,30));//设置位置和大小
button1->show(); //显示控件
button2->show(); //显示控件
myLabel= new MyLabel(this);
myLabel->setStyleSheet("background-color:rgb(100,150,150)"); //设置背景颜色
myLabel->setGeometry(QRect(100,100,300,80)); //设置位置和大小
myLabel->show(); //显示控件
}
MainWindow::~MainWindow()
{
delete ui;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
main.cpp
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
1
2
3
4
5
6
7
8
9
10
11
最后实现的效果如图,鼠标在按钮上时按钮上字体颜色为黄色,鼠标不在按钮上时按钮字体为黑色;鼠标在myLabel上时显示文字,不在时不显示。
(貌似截屏没有显示出鼠标指针位置)
Promote to 方法: 上面是只用代码的方法,也可以用提升(promote to)的方法,比如在写好了mylabel.h和mylabel.cpp文件后,在UI界面上添加一个QLabel控件(因为MyLabel类继承自QLabel),然后右键单击该控件,选择"promote to":
输入自己新建的类,以及该类所在的头文件,点击”Add“,勾选复选框,再点击右下角 Promote
可以看到它的类别已经成了MyLabel类:
为方便观察,我们可以把背景颜色改一下(去掉了文字):
结果如图:
还存在的问题:如果我把按钮或者QLabel的鼠标事件函数里写上setVisuable(true)和setVisuable(false),就是让控件显示或者消失,就会出现指针移动时闪烁的问题。
比如改动一下:
mylabel.cpp
#include "mylabel.h"
MyLabel::MyLabel(QWidget* parent) :QLabel(parent)
{
}
MyLabel::~MyLabel()
{
}
void MyLabel::enterEvent(QEvent *e)
{
setVisuable(false);
}
void MyLabel::leaveEvent(QEvent *e)
{
setVisuable(true);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
这样当鼠标指针在label上移动时,控件会一直在闪烁,对于按钮控件也是如此,不知道为什么。
有知道的欢迎交流一下!
---------------------