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

Qt学习之路之自定义按钮

首先,在此感谢博主:http:blog.sina.com.cnliang19890820按钮有三种状态:当鼠标点击的时候,当鼠标进入按钮的时候,当鼠标没有进入按钮的时候,这3个不同的状态。上代码

首先,在此感谢博主:http://blog.sina.com.cn/liang19890820

按钮有三种状态:当鼠标点击的时候,当鼠标进入按钮的时候,当鼠标没有进入按钮的时候,这3个不同的状态。

上代码~~~~

pushBtn_widget.h 

/*
贴图按钮的状态: 进入, 离开, 按下
*/


#ifndef PUSHBTNWIDGET_H
#define PUSHBTNWIDGET_H

#include
#include
#include

class PushBtnWidget : public QPushButton
{
Q_OBJECT
public:
explicit PushBtnWidget(QWidget *parent = 0);
void setPixButtonName(QString pushBtnName);

protected:
void enterEvent(QEvent *);
void leaveEvent(QEvent *);
void mousePressEvent(QMouseEvent *event);
void paintEvent(QPaintEvent *);
void mouseReleaseEvent(QMouseEvent *event);

private:
//---------------> 按钮几种按钮状态
enum btnStatus{NORMAL, ENTER, PRESS, NOSTATUS};
btnStatus pushBtnStatus;
QString pix_Name;

int btnWidth;// 按钮宽度
int btnHeight;// 按钮高度
bool mouse_press;// 鼠标左键是否按下
};
#endif//PUSHBTNWIDGET_H
pushBtn_widget. cpp

#include "pushBtn_widget.h"


PushBtnWidget::PushBtnWidget(QWidget *parent /*= 0*/)
:QPushButton(parent)
{
pushBtnStatus = NORMAL;// 初始化 按钮的图标状态
mouse_press = false;// 设置鼠标没有按下
}

/*
函数名:setPixButtonName
函数参数:QString pushBtnName
函数返回值: 无
*/
void PushBtnWidget::setPixButtonName(QString pushBtnName)
{
this->pix_Name = pushBtnName;
setFixedSize(QPixmap(pix_Name).size());
}

/*
函数名:enterEvent
函数参数:QEvent *event
函数返回值: 无
*/
void PushBtnWidget::enterEvent(QEvent *event)
{
pushBtnStatus = ENTER;
update();// -- 更新鼠标的状态
}

/*
函数名:leaveEvent
函数参数:QEvent *event
函数返回值: 无
*/
void PushBtnWidget::leaveEvent(QEvent *)
{
pushBtnStatus = NORMAL;
update();
}

/*
函数名:mousePressEvent
函数参数:QMouseEvent *event
函数返回值: 无
*/
void PushBtnWidget::mousePressEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton)//-------点击鼠标的左键
{
mouse_press = true;
pushBtnStatus = PRESS;
update();
}
}

/*
函数名: paintEvent
函数参数:QPaintEvent *event
函数返回值: 无
*/
void PushBtnWidget::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
QPixmap pixmap;
switch (pushBtnStatus)
{
case NORMAL:
{
pixmap.load(pix_Name);
break;
}
case ENTER:
{
pixmap.load(pix_Name + QString("_hover"));
break;
}
case PRESS:
{
pixmap.load(pix_Name + QString("_press"));
}
case NOSTATUS:
{
pixmap.load(pix_Name );
break;
}
default:
{
pixmap.load(pix_Name);
}
break;
}

painter.drawPixmap(rect(), pixmap);
}


/*
函数名: mouseReleaseEvent
函数参数:QMouseEvent *event
函数返回值: 无
*/
void PushBtnWidget::mouseReleaseEvent(QMouseEvent *event)
{
if (mouse_press && this->rect().contains(event->pos()))
{
mouse_press = false;
pushBtnStatus = ENTER;
update();
emit clicked();
}
}

说明:

准备好按钮3张图片,在添加按钮资源的时候,图片重命名如下图:

例如:

PushBtnWidget *closePixBtn;
PushBtnWidget *sendPixBtn;
closePixBtn = new PushBtnWidget(this);
sendPixBtn = new PushBtnWidget(this);

closePixBtn->setPixButtonName(":/pixbtn/closeBtn");
sendPixBtn->setPixButtonName(":/pixbtn/sendBtn");

connect(closePixBtn, SIGNAL(clicked()), qApp, SLOT(quit()));//---按钮信号
connect(sendPixBtn, SIGNAL(clicked()), this, SLOT(slotSendMsg()));

这里只是设置了按钮,但是没有指定按钮的位置。。

      这样就能打造自己喜欢的的按钮了



推荐阅读
  • IOS开发之短信发送与拨打电话的方法详解
    本文详细介绍了在IOS开发中实现短信发送和拨打电话的两种方式,一种是使用系统底层发送,虽然无法自定义短信内容和返回原应用,但是简单方便;另一种是使用第三方框架发送,需要导入MessageUI头文件,并遵守MFMessageComposeViewControllerDelegate协议,可以实现自定义短信内容和返回原应用的功能。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 本文介绍了Codeforces Round #321 (Div. 2)比赛中的问题Kefa and Dishes,通过状压和spfa算法解决了这个问题。给定一个有向图,求在不超过m步的情况下,能获得的最大权值和。点不能重复走。文章详细介绍了问题的题意、解题思路和代码实现。 ... [详细]
  • 本文介绍了使用Spark实现低配版高斯朴素贝叶斯模型的原因和原理。随着数据量的增大,单机上运行高斯朴素贝叶斯模型会变得很慢,因此考虑使用Spark来加速运行。然而,Spark的MLlib并没有实现高斯朴素贝叶斯模型,因此需要自己动手实现。文章还介绍了朴素贝叶斯的原理和公式,并对具有多个特征和类别的模型进行了讨论。最后,作者总结了实现低配版高斯朴素贝叶斯模型的步骤。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板
    本文介绍了在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板的方法和步骤,包括将ResourceDictionary添加到页面中以及在ResourceDictionary中实现模板的构建。通过本文的阅读,读者可以了解到在Xamarin XAML语言中构建控件模板的具体操作步骤和语法形式。 ... [详细]
  • 开发笔记:实验7的文件读写操作
    本文介绍了使用C++的ofstream和ifstream类进行文件读写操作的方法,包括创建文件、写入文件和读取文件的过程。同时还介绍了如何判断文件是否成功打开和关闭文件的方法。通过本文的学习,读者可以了解如何在C++中进行文件读写操作。 ... [详细]
  • 李逍遥寻找仙药的迷阵之旅
    本文讲述了少年李逍遥为了救治婶婶的病情,前往仙灵岛寻找仙药的故事。他需要穿越一个由M×N个方格组成的迷阵,有些方格内有怪物,有些方格是安全的。李逍遥需要避开有怪物的方格,并经过最少的方格,找到仙药。在寻找的过程中,他还会遇到神秘人物。本文提供了一个迷阵样例及李逍遥找到仙药的路线。 ... [详细]
  • 本文讨论了如何在codeigniter中识别来自angularjs的请求,并提供了两种方法的代码示例。作者尝试了$this->input->is_ajax_request()和自定义函数is_ajax(),但都没有成功。最后,作者展示了一个ajax请求的示例代码。 ... [详细]
  • 模板引擎StringTemplate的使用方法和特点
    本文介绍了模板引擎StringTemplate的使用方法和特点,包括强制Model和View的分离、Lazy-Evaluation、Recursive enable等。同时,还介绍了StringTemplate语法中的属性和普通字符的使用方法,并提供了向模板填充属性的示例代码。 ... [详细]
  • STL迭代器的种类及其功能介绍
    本文介绍了标准模板库(STL)定义的五种迭代器的种类和功能。通过图表展示了这几种迭代器之间的关系,并详细描述了各个迭代器的功能和使用方法。其中,输入迭代器用于从容器中读取元素,输出迭代器用于向容器中写入元素,正向迭代器是输入迭代器和输出迭代器的组合。本文的目的是帮助读者更好地理解STL迭代器的使用方法和特点。 ... [详细]
  • Gitlab接入公司内部单点登录的安装和配置教程
    本文介绍了如何将公司内部的Gitlab系统接入单点登录服务,并提供了安装和配置的详细教程。通过使用oauth2协议,将原有的各子系统的独立登录统一迁移至单点登录。文章包括Gitlab的安装环境、版本号、编辑配置文件的步骤,并解决了在迁移过程中可能遇到的问题。 ... [详细]
author-avatar
lf8762
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有