Qt播放器之自定义按钮

Qt播放器之自定义按钮一、前言在做播放器时,Qt自带的按钮部件虽然很强大,但是显示效果还是不能令人满意。于是决定自定义一个简单的按钮部件。按钮部件只简单的显示按下、释放两个状态,并且只发出clicked()信号。基本功能如下:   当按下时显示一个按下的图标;   当释放时显示另一

大家好,又见面了,我是你们的朋友全栈君。

一、前言

在做播放器时,Qt自带的按钮部件虽然很强大,但是显示效果还是不能令人满意。于是决定自定义一个简单的按钮部件。按钮部件只简单的显示按下、释放两个状态,并且只发出clicked()信号。
基本功能如下:
    当按下时显示一个按下的图标;
    当释放时显示另一个释放的图标,并且发出clicked()信号;
二、程序代码

//button.h

#ifndef BUTTON_H
#define BUTTON_H
#include <QPixmap>

class Button:public QWidget
{

    Q_OBJECT
public:
    Button(QWidget *parent, QPixmap pressed_pixmap, QPixmap released_pixmap);
signals:
    void clicked();
private:
    QPixmap m_pressed;
    QPixmap m_released;

    bool pressed;

protected:
    void mousePressEvent(QMouseEvent *);
    void mouseReleaseEvent(QMouseEvent *);
    void paintEvent(QPaintEvent *);
};

#endif // BUTTON_H

说明:在创建按钮时提供两个图标,一个是按下的,一个是释放的;

//button.cpp

#include “button.h”
#include <QPainter>

Button::Button(QWidget *parent, QPixmap normal_pixmap, QPixmap released_pixmap)
    :QWidget(parent),m_normal(normal_pixmap),m_released(released_pixmap),pressed(false)
{

    update(); //调用update(),引发重绘事件,调用paintEvent()事件处理函数
}

void Button::mousePressEvent(QMouseEvent * e)
{

    pressed=true;
    update();
}

void Button::mouseReleaseEvent(QMouseEvent *e)
{

    pressed=false;
    update();
    emit(clicked());
}

void Button::paintEvent(QPaintEvent *e)
{

    QPainter painter(this);

    if(pressed)
    {

        resize(m_normal.size());
        painter.drawPixmap(0,0,m_normal);
    }
    else
    {

        resize(m_released.size());
        painter.drawPixmap(0,0,m_released);
    }
}

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/132008.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 线程用户态和内核态

    线程用户态和内核态(1)用户态和内核态的概念?—>内核态:CPU可以访问内存所有数据,包括外围设备,例如硬盘,网卡.CPU也可以将自己从一个程序切换到另一个程序—>用户态:只能受限的访问内存,且不允许访问外围设备.占用CPU的能力被剥夺,CPU资源可以被其他程序获取(2)为什么需要用户态和内核态?—>由于需要限制不同的程序之间的访问能力,防止他们获取别的程序的内存数据,…

    2022年10月26日
  • vs2019中scanf返回值被忽略_vs2017scanf

    vs2019中scanf返回值被忽略_vs2017scanf一、问题再现如下是笔者在学习数据结构中的二叉树时遇到的问题:报错警告:返回值被忽略:”scanf”。二、问题分析百度一下之后大致原因是:scanf()函数在读取时不检查边界,所以可能会造成内存泄漏。有一定的安全隐患。微软公司觉得其不安全,所以在VS编译器中提供了scanf_s()函数,这是VS编译器特有的函数。强制用户提升安全性,如果想要在VS中使用scanf()函数,则可以通过一下4中方法解决。三、解决方案1、把scanf改成:scanf_s把所有的scanf()改

  • sql学生选课管理系统[通俗易懂]

    sql学生选课管理系统[通俗易懂]一、概要设计1.1目的和意义学生选课系统作为一种现代化的教学技术,被广泛应用于学校的学生选课,是一个学校不可或缺的部分,学生选课系统使管理选课信息更加简单,学生选课更加方便。学生选课系统的将使选课管理工作规范化、系统化、程序化,避免选课管理的无条理性,提高信息处理的速度和准确性,能够准确、及时、有效的查询和修改学生选课情况。与传统的选课方式相比,网上选课系统利用局域网为学生选课带来了极大的便捷。学生在公共机房,或者宿舍的个人电脑上便可以通过校园网络来选课。在选课时间内,学生能够使用选课系统灵活的修

  • markersize是什么意思_Marker

    markersize是什么意思_Marker为什么80%的码农都做不了架构师?>>>…

    2022年10月22日
  • intellij mac 永久激活码_在线激活2022.02.02「建议收藏」

    (intellij mac 永久激活码)2021最新分享一个能用的的激活码出来,希望能帮到需要激活的朋友。目前这个是能用的,但是用的人多了之后也会失效,会不定时更新的,大家持续关注此网站~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.cn/100143.html…

  • ssm框架过时了吗_ssm和mvc框架

    ssm框架过时了吗_ssm和mvc框架日志如果一个数据库操作,出现了异常,我们需要排错,日志就是最好的助手曾经:sout,debug现在:日志工厂掌握STDOUT_LOGGINGLOG4Jlog4j什么是Log4j?我们可以控制日志信息输送的目的地是控制台我们也可以控制每一条日志的输出格式通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。分页减少数据量selsect * from user limit startIndex,pageS

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号