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(http://www.my516.com);

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);
}
---------------------

Qt 为QPushButton、QLabel添加鼠标移入移出事件的更多相关文章

  1. 用JQuery给图片添加鼠标移入移出事件

    $("#addLineImg").mouseover( function(){ $("#addLineImg").attr("src",&q ...

  2. Vue 鼠标移入移出事件

    Vue 中鼠标移入移出事件 @mouseover和@mouseleave 然后绑定style   现在开始代码示例 <template> <div class="pc&qu ...

  3. js鼠标移入移出事件会被子元素触发解决方法

    问题:js写了一个鼠标移入移出事件,但是发现会被内部子元素不断的触发 解决方法:建立一个空的div定位到需要触发的位置,然后设置大小和触发范围一样,最后将事件写在空的div上.

  4. js(jquery)鼠标移入移出事件时,出现闪烁、隐藏显示隐藏显示不停切换的情况

    <script> $(".guanzhu").hover(function(){ $(".weixinTop").show(); },functio ...

  5. JS添加、设置属性以及鼠标移入移出事件

    源代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <titl ...

  6. Javascript和jquery事件-鼠标移入移出事件

    javascript使用mouseover和mouseout,只在css中支持hover jquery支持mouseover和mouseout,封装了mouseenter.mouseleave事件函数 ...

  7. javascript父级鼠标移入移出事件中的子集影响父级的处理方法

    一.我们先分析其产生的原因: 1.当鼠标从父级移入子集时触发了父级的两个事件:a.父级的mouseout事件(父级离开到子集):b.由于事件冒泡影响,又触发了父级的mouseover事件(父级移入父级 ...

  8. jquery的鼠标移入移出事件hover、mouseenter、mouseleave、mouseover、mouseout

    hover:鼠标进入元素的子元素时不会触发‘鼠标移开’的事件: mouseenter.mouseleave:效果与hover相同: mouseover: 鼠标进入元素和进入它的子元素时都会触发‘mou ...

  9. vue 鼠标移入移出事件执行多次(尤其ie)

    来自:https://www.cnblogs.com/myfirstboke/p/9150809.html  侵删 <p @mouseover="over($event)" ...

随机推荐

  1. CodeForces-245H:Queries for Number of Palindromes(3-14:区间DP||回文串)

    Times:5000ms: Memory limit:262144 kB 给定字符串S(|S|<=5000),下标由1开始.然后Q个问题(Q<=1e6),对于每个问题,给定L,R,回答区间 ...

  2. BZOJ1453: [WC2005]Dface双面棋盘

    离线LCT维护MST,和3082的方法一样.然而比较码农,适合颓废的时候写. PS:线段树分治要好写得多,LCT比较自娱自乐. #include<bits/stdc++.h> using ...

  3. Python-Django使用MemcachedCache缓存

    最近工作中使用到缓存,简单记录之... 关于django的几种缓存方式,就不在做介绍了,网上一搜一大把:1.8.2官方文档, Django 缓存,Python菜鸟之路:django缓存 学习了之后,选 ...

  4. bzoj 4260 REBXOR —— Trie树

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4260 用 Trie 树可以找出前缀异或的最大值和后缀异或的最大值,拼起来即可: 注意要先加入 ...

  5. robotframework之APP混合H5自动化测试

    app中有webview的情况 手机淘宝的天猫国际页面是一个webview robotframework代码: *** Settings *** Suite Setup Suite Teardown ...

  6. hdoj5402 【模拟/构造】

    题意: 给你一个矩阵,每个值都是非负,然后让你从左上角走到右下角,每个点只能走一次,求到终点的最大值,还要输出一条路径 思路: 一开始拿到还以为搜索之类的,但是发现神特么暴力+麻烦(因为路径这个东西. ...

  7. 洛谷P1850 换教室(概率dp)

    传送门 我的floyd竟然写错了?今年NOIP怕不是要爆零了? 这就是一个概率dp 我们用$dp[i][j][k]$表示在第$i$个时间段,已经申请了$j$次,$k$表示本次换或不换,然后直接暴力转移 ...

  8. PJzhang:centos7动态IP和静态IP两种方式的设置

    猫宁!!! 参考链接:https://blog.csdn.net/m0_37776094/article/details/81736900 如果centos7只设置静态IP,对于不断切换无线网的情况并 ...

  9. 安全性测试入门 (三):CSRF 跨站请求伪造攻击和防御

    本篇继续对于安全性测试话题,结合DVWA进行研习. CSRF(Cross-site request forgery):跨站请求伪造 1. 跨站请求伪造攻击 CSRF则通过伪装成受信任用户的请求来利用受 ...

  10. poj1850 Code【组合数学】By cellur925

    题意: * 按照字典序的顺序从小写字母 a 开始按顺序给出序列 (序列中都为升序字符串)* a - 1* b - 2* ...* z - 26* ab - 27* ...* az - 51* bc - ...