热门标签 | 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();}

 
 


 

 

 

 


推荐阅读
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • 1.RoIPoolingRoIPooling顾名思义对Roi进行Pooling操作,主要用于目标检测任务。RoI(Regionofinterest&# ... [详细]
  • Html5-Canvas实现简易的抽奖转盘效果
    本文介绍了如何使用Html5和Canvas标签来实现简易的抽奖转盘效果,同时使用了jQueryRotate.js旋转插件。文章中给出了主要的html和css代码,并展示了实现的基本效果。 ... [详细]
  • Ihaveaworkfolderdirectory.我有一个工作文件夹目录。holderDir.glob(*)>holder[ProjectOne, ... [详细]
  • jQuery实现简单的动画效果及用法详解
    本文详细介绍了使用jQuery实现简单动画效果的方法,包括显示/隐藏、向上收缩/向下展开、淡入/淡出、自定义动画等。同时提供了具体的用法示例,并解释了参数的含义和使用技巧。通过本文的学习,读者可以掌握如何使用jQuery实现各种动画效果,为网页增添生动和互动性。 ... [详细]
  • loader资源模块加载器webpack资源模块加载webpack内部(内部loader)默认只会处理javascript文件,也就是说它会把打包过程中所有遇到的 ... [详细]
  • Java8 Stream流Intermediate中间操作详细解析 ... [详细]
  • 1、完成图标功能要实现图标功能,首先是后端建表建dict表DROPTABLEIFEXISTSdict;CREATETABLEdict(namevarchar(2 ... [详细]
  • $(function(){$(#search_button).button({icons:{primary:ui-icon-search,},});$(#reg).dialog({ ... [详细]
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社区 版权所有