案例2:绘制按钮

main.cpp

#include<QApplication>

#include “demoWidget.h”

int  main(int  args , int argv)

{

QApplication  app(args , argv);

DemoWidget w;

w.resize(400,400);

w.setVisible(true);

return  app.exec();

}

main.pro

TEMPLATE=app

SOURCES=main.cpp demoWidget.cppdemoPushButton.cpp

HEADERS=demoWidget.h demoPushButton.h

CONFIG=release qt

QT=core gui

TARGET=main

demoWidget.h

#ifndef DEMO2_WIDGET_H

#define DEMO2_WIDGET_H

#include<QWidget>

#include “demoPushButton.h”

class  DemoWidget: public QWidget

{

public:

DemoWidget(QWidget * parent=NULL);

public:

DemoPushButton * btn;

};

#endif

demoWidget.cpp

#include “demoWidget.h”

#include “demoPushButton.h”

DemoWidget::DemoWidget(QWidget *parent):QWidget(parent)

{

btn = new DemoPushButton(this);

btn->resize(100,30);

btn->move(100,100);

}

绘制按钮:

demoPushButton.h

#include<QPushButton>

#include<QPaintEvent>

#include<QMouseEvent>

#ifndef DEMO2_PUSHBUTTON_H

#define DEMO2_PUSHBUTTON_H

class DemoPushButton : public QPushButton

{

public:

DemoPushButton(QWidget * parent=NULL);

protected:

virtual void paintEvent(QPaintEvent * e);

virtual void  enterEvent(QEvent * e);

virtual void  leaveEvent(QEvent * e);

virtual void  mouseEvent(QMouseEvent*e);

private:

bool  israised;

};

#endif

demoPushButton.cpp

#include “demoPushButton”

#include<QColor>

#include<QBrush>

#include<QPen>

#include<QPoint>

#include<QPainter>

DemoPushButton::DemoPushButton(QWidget*parent)

:QPushButton(parent),israised(true)

{

setMouseTracking(true);   //跟踪鼠标移动事件

}

void DemoPushButton::paintEvent(QPaintEvent* e)

{

//绘制按钮的边界

int  w=width();   //按钮宽度

int  h=height();   //按钮高度

QColor clrw(255,255,255);

QColor clrb(0,0,0);

QBrush brw(clrw);

QBrush brb(clrb);

QPen  penw(brw,2);

QPen  penb(brb,2);

QPoint  pttop(w/2,0);

QPoint ptbottom(w/2,h);

QPoint ptleft(0,h/2);

QPoint ptright(w,h/2);

QPainter  g(this);

if(israised)

{

g.setPen(penw);

}

else

{

g.setPen(penb);

}

g.drawLine(pttop,ptleft);

g.drawLine(pttop,ptright);

if(israised)

{

g.setPen(penb);

}

else

{

g.setPen(penw);

}

g.drawLine(ptbottom,ptleft);

g.drawLine(ptbotton,ptrright);

}

void DemoPushButton::enterEvent(QEvent * e)

{

israised=false;

repaint();     //重新绘制按钮

}

void DemoPushButton::leaveEvent(QEvent * e)

{

israised=true;

repaint();

}

void DemoPushButton::mouseEvent(QMouseEvent * e)

{

float  w=this->width();

float  h=this->height()

int  x=e->x();

int  y=e->y();

float k=h/w;    //斜率

if( y>-k*x+h/2 &&

y>=k*x-h/2 &&

y<=k*x+h/2 &&

y<=-k*x+3*h/2)

{

israise=false;

}

else

{

israise=true;

}

repaint();

}

QT 绘制按钮 paintEvent enterEvent leaseEvent mouseEvent的更多相关文章

  1. Qt 圆角按钮,面版自动布局

    一.前言 在部分界面开发中,有时需要动态添加控件或按钮到面板中,在不需要时又需要删除该控件,故模仿视频开发中的设置屏蔽词,通过自己绘制的按钮与排布面板控件实现. 实现效果如下: 说明: 1.输入框可设 ...

  2. QT绘制饼图

    QT版本:QT5.6.1 QT绘制饼图,出问题的代码如下 void DrawPieDialog::paintEvent(QPaintEvent *event) { float startAngle=0 ...

  3. Qt绘制文本一

    QPainterPath,使用 drawText且设置字体,再使用painter.drawText方式 效果图: void WgtText::paintEvent(QPaintEvent *event ...

  4. Qt 学习之路 2(24):Qt 绘制系统简介

    Qt 学习之路 2(24):Qt 绘制系统简介 豆子 2012年10月30日 Qt 学习之路 2 77条评论 Qt 的绘图系统允许使用相同的 API 在屏幕和其它打印设备上进行绘制.整个绘图系统基于Q ...

  5. Qt浮动按钮的实现(使用窗口背景透明、实现只显示浮动按钮的目的)

    Qt浮动按钮的实现 效果如下: 图3 估计很多做Qt有一定经验的朋友会觉得这个效果不难,但是这是一个需求奇葩的实际业务中做出的效果.笔者会想讲下客户的需求和整体框架的矛盾. 整个项目主要是由Qt搭建的 ...

  6. 自绘实现半透明水晶按钮(继承CButton,设置BS_OWNERDRAW风格,覆盖DrawItem函数绘制按钮,把父窗口的背景复制到按钮上,实现视觉上的透明,最后通过AlphaBlend实现半透明)

    运行效果 实现方法 1.给按钮加上BS_OWNERDRAW样式2.重载DrawItem函数,在这里绘制按钮3.关键之处就是把父窗口的背景复制到按钮上,实现视觉上的透明4.最后通过AlphaBlend实 ...

  7. QT绘制半透明窗体(改写paintEvent,超级简单)

    在派生类中重载QDialog的void paintEvent(QPaintEvent *)事件,在这个函数中加入以下代码 QPainter painter(this);    QLinearGradi ...

  8. Qt绘制异形窗体

    异形窗体即不规则窗体,一般采用png图片,一般绘制异形窗体分两步: 1.设置遮罩区 2.绘制图片   使用png图片的透明部分作为遮罩区,然后绘制图片,这样我们就看到一个只绘制了非透明部分的图形,废话 ...

  9. Qt 学习之路 :Qt 绘制系统简介

    Qt 的绘图系统允许使用相同的 API 在屏幕和其它打印设备上进行绘制.整个绘图系统基于QPainter,QPainterDevice和QPaintEngine三个类. QPainter用来执行绘制的 ...

随机推荐

  1. LeeCode-Remove Duplicates from Sorted List

    Given a sorted linked list, delete all duplicates such that each element appear only once. For examp ...

  2. Unity 制作RPG小地图

    效果图: 最近公司要制作小地图,搜索网上的文章没找到有什么小实例,=.=直接上步骤: 制作小地图步骤: 1. 人物头顶有一个面板呈现人物图标 2. 有一个摄像机在主角头顶!(Target Textur ...

  3. IOS7 UITableView一行滑动删除后 被删除行的下一行的点击事件将被忽略解决办法

    - (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSI ...

  4. java面试题集3

    一.选择题 1.下面程序的运行结果是 int i=0; while(true){ if(i++>10)  break; System.out.println(i); }1-11 2.下面程序的运 ...

  5. DNA Sorting(排序)

    欢迎参加——BestCoder周年纪念赛(高质量题目+多重奖励) DNA Sorting Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: ...

  6. angular在ie8下的一个bug

    昨天拿项目在ie8下测试,发现不少bug,其中有一个bug让我很不解,报了一个thead开头的bug,因为已经切回到linux下了,我就不报具体是什么bug了,鼓捣了半天,发现引用angular的应用 ...

  7. 【计算几何初步:多边形中心】【HDU1115】Lifting the Stone

    一.质点系重心公式 x=(x1*m1+x2*m2+x3*m3.....xn*mn)/M  (M=m1+m2+m3+m4...+mn) 二.三角形重心 可直接求得,但在多边形剖分中 各三角形的质点的质量 ...

  8. Android服务端本地窗口FramebufferNativeWindow

    Android窗口系统 我们知道Android系统采用OpenGL来绘制3D图形,OpenGL ES提供了本地窗口(NativeWindow)的概念,无论是在Android平台中还是其他平台中,只要实 ...

  9. CSS-边框-效果

    1.1边框 其中边框圆角.边框阴影属性,应用十分广泛,兼容性也相对较好,具有符合渐进增强原则的特性,我们需要重点掌握. 1.1.1边框圆角 border-radius 每个角可以设置两个值,x值,y值 ...

  10. Json.Net序列化和反序列化设置

    首先补充一点,Json.Net是支持序列化和反序列化DataTable,DataSet,Entity Framework和NHibernate的.我举例说明DataTable的序列化和反序列化.创建一 ...