热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

用Qt设计一个属于自己的图标按钮

学c++以来,用qt做过一些界面,个人感觉软件界面还是比较漂亮的,但是如果界面想嵌入一些漂亮的图标做按钮,利用qt本身已有的控件实现就有点困难了,当然可以通过为QPushBut

         学c++以来,用qt做过一些界面,个人感觉软件界面还是比较漂亮的,但是如果界面想嵌入一些漂亮的图标做按钮,利用qt本身已有的控件实现就有点困难了,当然可以通过为QPushButton类添加背景图标来实现,但是自我感觉效果不是很好,所以写了这篇博客,想实现一下用纯图片来做按钮控件,通过改变图片的观感,比如图片的形状大小,来表示按钮的选中或者未选中,同时为这图片按钮添加鼠标事件,从而模拟一个按键出来,这样的好处主要是它能为界面增色,不同的图片,形状,大小以及按钮选中和未选中所展现给用户的不同观感将大大提高界面整体的美化程度。

设计思路主要通过重载Qt的几个事件实现,

void mousePressEvent(QMouseEvent *event);

    void paintEvent(QPaintEvent *event);

    void enterEvent(QEvent *event);

void leaveEvent(QEvent *event);

同时还需要为图标按钮添加一个信号函数,void isclicked(),由该函数发送鼠标按下的信号,供其他类使用。

代码简要分析:

/*IconButton类的构造函数*/

IconButton::IconButton(QString iconStr1,QString iconStr2,QWidget *parent)

    : QWidget(parent, Qt::FramelessWindowHint)

{

 

    //加载图片作为程序的界面

    m_Pixmap.load(iconStr1);

    m_Pixmap1.load(iconStr2);

    if(m_Pixmap1.size().width()

    {

        m_Pixmap.load(iconStr2);

        m_Pixmap1.load(iconStr1);

    }

    leave=true; //初始化图标按钮为未选中状态

    this->x=0;  //初始化图标按钮的位置

    this->y=0;

}

/*重载mousePressEvent函数*/

void IconButton::mousePressEvent(QMouseEvent *event)

{

    //按下左键则发送按下信号

    if(event->button() == Qt::LeftButton)

    {

        emit isclicked();

    }

}

/*重载paintEvent函数*/

void IconButton::paintEvent(QPaintEvent *event)

{

    QPainter painter(this);

//分两种情况来显示不同的外观,未选中时画m_Pixmap,选中时画m_Pixmap1

    if(leave)

    {

        resize( m_Pixmap.size() );

        painter.drawPixmap(0,0, m_Pixmap);

        move(x+(m_Pixmap1.size().width()-m_Pixmap.size().width())/2,y+(m_Pixmap1.size().width()-m_Pixmap.size().width())/2);

    }

   else

    {

        resize( m_Pixmap1.size() );

        painter.drawPixmap(0, 0, m_Pixmap1);

        move(x,y);

        this->setToolTip(iconTip);

    }

}

/*重载:leaveEvent函数*/

void IconButton::leaveEvent(QEvent *event)

{

    //鼠标离开窗口时是普通的指针

    setCursor(Qt::ArrowCursor);

    leave=true;

    update(); //调用paintevent函数进行更新

}

/*重载:enterEvent函数*/

void IconButton::enterEvent(QEvent *event)

{

    //鼠标留在窗口上时是一个手指,表示可以读取按键事件

    setCursor(Qt::PointingHandCursor);

    leave=false;

    update();//调用paintevent函数进行更新

}

//下面是供给用户使用的两个基本接口,分别是设置图标按钮的位置以及需要显示的提示信息,这里只简单的写了两个功能,还可以增加其他功能,使这个IconButton类更加完善

void IconButton::setPosition(int x,int y)

{

    this->x=x;

    this->y=y;

}

void IconButton::setIconTip(QString iconTip)

{

    this->icOnTip=iconTip;

}

 

以下是实现该类的源码:

iconButton.h

#ifndef ICONBUTTON_H
#define ICONBUTTON_H

#include
class IconButton : public QWidget
{
Q_OBJECT
public:
IconButton(QString iconStr1,QString iconStr2,QWidget *parent = 0);
void setPosition(int x,int y);
void setIconTip(QString iconTip);

protected:
void mousePressEvent(QMouseEvent *event);
void paintEvent(QPaintEvent *event);
void enterEvent(QEvent *event);
void leaveEvent(QEvent *event);
signals:
void isclicked();
private:
QPixmap m_Pixmap,m_Pixmap1;
int x,y;
QString iconTip;
bool leave;
};


#endif // ICONBUTTON_H
 
iconButton.cpp
 
#include "iconButton.h"#include IconButton::IconButton(QString iconStr1,QString iconStr2,QWidget *parent)    : QWidget(parent, Qt::FramelessWindowHint){    //加载一幅有部分区域是透明的图片作为程序的界面    m_Pixmap.load(iconStr1);    m_Pixmap1.load(iconStr2);    if(m_Pixmap1.size().width()x=0;    this->y=0;}void IconButton::mousePressEvent(QMouseEvent *event){    //按住左键关闭程序    if(event->button() == Qt::LeftButton)    {        emit isclicked();    }}void IconButton::setPosition(int x,int y){    this->x=x;    this->y=y;}void IconButton::setIconTip(QString iconTip){    this->icOnTip=iconTip;}void IconButton::paintEvent(QPaintEvent *event){    qDebug("paint");    QPainter painter(this);    if(leave)    {        resize( m_Pixmap.size() );        //setMask( m_Pixmap.mask() );        painter.drawPixmap(0,0, m_Pixmap);        move(x+(m_Pixmap1.size().width()-m_Pixmap.size().width())/2,y+(m_Pixmap1.size().width()-m_Pixmap.size().width())/2);    }   else    {        resize( m_Pixmap1.size() );        //setMask( m_Pixmap1.mask() );        painter.drawPixmap(0, 0, m_Pixmap1);        move(x,y);        this->setToolTip(iconTip);    }}void IconButton::leaveEvent(QEvent *event){    //鼠标离开窗口时是普通的指针    setCursor(Qt::ArrowCursor);    leave=true;    update();}void IconButton::enterEvent(QEvent *event){    //鼠标留在窗口上时是一个手指    setCursor(Qt::PointingHandCursor);    leave=false;    update();}

 
 


 

 

 

 


推荐阅读
  • 本文探讨了在Java中实现系统托盘最小化的两种方法:使用SWT库和JDK6自带的功能。通过这两种方式,开发者可以创建跨平台的应用程序,使窗口能够最小化到系统托盘,并提供丰富的交互功能。 ... [详细]
  • 在本教程中,我们将深入探讨如何使用 Python 构建游戏的主程序模块。通过逐步实现各个关键组件,最终完成一个功能完善的游戏界面。 ... [详细]
  • 我在尝试将组合框转换为具有自动完成功能时遇到了一个问题,即页面上的列表框也被转换成了自动完成下拉框,而不是保持原有的多选列表框形式。 ... [详细]
  • 在 Angular Google Maps 中实现图片嵌入信息窗口的功能,可以通过使用 `@agm/core` 库来实现。该库提供了丰富的 API 和组件,使得开发者可以轻松地在地图上的信息窗口中嵌入图片。本文将详细介绍如何配置和使用这些组件,以实现动态加载和显示图片的功能。此外,还将探讨一些常见的问题和解决方案,帮助开发者更好地集成这一功能。 ... [详细]
  • 深入解析Android自定义View面试题
    本文探讨了Android Launcher开发中自定义View的重要性,并通过一道经典的面试题,帮助开发者更好地理解自定义View的实现细节。文章不仅涵盖了基础知识,还提供了实际操作建议。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 如何高效创建和使用字体图标
    在Web和移动开发中,为什么选择字体图标?主要原因是其卓越的性能,可以显著减少HTTP请求并优化页面加载速度。本文详细介绍了从设计到应用的字体图标制作流程,并提供了专业建议。 ... [详细]
  • 本文介绍如何使用 Android 的 Canvas 和 View 组件创建一个简单的绘图板应用程序,支持触摸绘画和保存图片功能。 ... [详细]
  • 本题探讨了在大数据结构背景下,如何通过整体二分和CDQ分治等高级算法优化处理复杂的时间序列问题。题目设定包括节点数量、查询次数和权重限制,并详细分析了解决方案中的关键步骤。 ... [详细]
  • 深入理解Vue.js:从入门到精通
    本文详细介绍了Vue.js的基础知识、安装方法、核心概念及实战案例,帮助开发者全面掌握这一流行的前端框架。 ... [详细]
  • 使用JS、HTML5和C3创建自定义弹出窗口
    本文介绍如何结合JavaScript、HTML5和C3.js来实现一个功能丰富的自定义弹出窗口。通过具体的代码示例,详细讲解了实现过程中的关键步骤和技术要点。 ... [详细]
  • 本文介绍如何在C#中将GridView控件的内容保存为图片文件。通过代码示例,详细说明了创建位图、绘制图形并保存图像的步骤。 ... [详细]
  • 本文介绍了如何在iOS应用中自定义导航栏按钮,包括使用普通按钮和图片生成导航条专用按钮的方法。同时,探讨了在不同版本的iOS系统中实现多按钮布局的技术方案。 ... [详细]
  • springMVC JRS303验证 ... [详细]
  • C/C++ 应用程序的安装与卸载解决方案
    本文介绍了如何使用Inno Setup来创建C/C++应用程序的安装程序,包括自动检测并安装所需的运行库,确保应用能够顺利安装和卸载。 ... [详细]
author-avatar
ga70752ga你
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有