• Qt 为QPushButton、QLabel添加鼠标移入移出事件


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

  • 相关阅读:
    bzoj 2002: [Hnoi2010]Bounce 弹飞绵羊
    1691: [Usaco2007 Dec]挑剔的美食家
    CF809E Surprise me!
    「总结」狄利克雷卷积,莫比乌斯反演和杜教筛
    AT3611 Tree MST
    AT2134 Zigzag MST
    CF891C Envy
    【HNOI2018】游戏
    【HNOI2016】树
    【HNOI2016】网络
  • 原文地址:https://www.cnblogs.com/hyhy904/p/11058031.html
Copyright © 2020-2023  润新知