案例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. hdu 2079 选课时间_母函数

    题意:需要学够n学分,有k个情况(x学分,y个相同学分的课) 解法:套母函数模板 #include <iostream> #include<cstdio> using name ...

  2. 自定义View的封装

    通过上一个博文的自定义View的编写后,发现代码其实挺复杂的,所有这里通过对代码进一步的优化,即用到了java的一个重要的特点:封装.通过对父类的方法进行封装,然后在子类继承后实现相应的函数即可,达到 ...

  3. 本人对于JavaScript的一些总结

    类型.值和变量 1.原始类型   数字.字符串和布尔   null空  undefined未定义 2.对象类型 3.类  Array  Function Date RegExp  Error 4.js ...

  4. Calculation(dfs+状压dp)

    Problem 1608 - Calculation Time Limit: 500MS   Memory Limit: 65536KB    Total Submit: 311  Accepted: ...

  5. PCI、PCIE配置空间的訪问(MCFG,Bus,Device,Funtion)

    一般来说,在x86平台上,有两大类方式能够訪问这一区间的寄存器,   1,配置机制1#或者配置机制2#   訪问时借助in/out指令.请注意,这样的方式有别于一般的in/out指令訪问PCI的IO空 ...

  6. 多线程中的lua同步问题

    最近写paintsnow::start时出现了一个非常麻烦的BUG,程序的Release版本大约每运行十几次就会有一次启动时崩溃(Debug版本还没崩溃过),崩溃点也不固定.经过简单分析之后,确定是线 ...

  7. [bzoj2301: [HAOI2011]Problem b] 乞讨

    </pre><pre code_snippet_id="507886" snippet_file_name="blog_20141104_2_53831 ...

  8. react-native 布局基础

    宽度单位和像素密度 react的宽度不支持百分比,设置宽度时不需要带单位 {width: 10}, 那么10代表的具体宽度是多少呢? 不知道是官网文档不全还是我眼瞎,反正是没找到,那做一个实验自己找吧 ...

  9. C#整理8——结构体

    结构体:相当于是我们自己定义的一种复杂的类型.int... double float bool char string DateTime 数组类型生活中大部份的对象都是复合型的对象. 如何定义结构体类 ...

  10. NodeJS初学者实战之旅(I) —— 介绍、目录

    旅行之初 作为一个工作了两年多后端开发人员,未接触过NodeJS,对它的认知也仅仅停留在“可以使用JavaScript代码编写服务端程序”上.最近空闲时间 较多,便想来啃它一啃.但是没有一个实际的玩意 ...