zoukankan      html  css  js  c++  java
  • 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();

    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上移动时,控件会一直在闪烁,对于按钮控件也是如此,不知道为什么。
    有知道的欢迎交流一下!
    --------------------- 

  • 相关阅读:
    [置顶] windows player,wzplayerV2 for windows
    wzplayer 近期将会支持BlackBerry和WinPhone8
    wzplayerEx for android(真正硬解接口,支持加密的 player)
    ffmpeg for ios 交叉编译 (支持i686 armv7 armv7s) 包含lame支持
    ffmpeg for ios 交叉编译 (支持i686 armv7 armv7s) 包含lame支持
    编译cegcc 0.59.1
    wzplayer 近期将会支持BlackBerry和WinPhone8
    wzplayerEx for android(真正硬解接口,支持加密的 player)
    windows player,wzplayerV2 for windows(20140416)更新
    编译cegcc 0.59.1
  • 原文地址:https://www.cnblogs.com/hyhy904/p/11026643.html
Copyright © 2011-2022 走看看