Qt中需要自定义/绘制控件时,基本上继承自QWidget,重新实现绘制函数,定义大小,增加相应的信号和槽……

例子:自定义旋钮控件,通过鼠标控制旋转(可通过Qt的世界变换旋转图形),并在旋转停止时触发一次信号获得当前角度。

实现效果:

 

实现:

自定义控件类,

#ifndef WHIRLBUTTON_H
#define WHIRLBTUUON_H#include <QColor>
#include <QImage>
#include <QWidget>#define whirlbuttonHeigth   130
#define whirlbuttonWidth    120class whirlbutton : public QWidget
{Q_OBJECT
public:void  paintEvent(QPaintEvent *event);whirlbutton();~whirlbutton();void setDegree(int deg);int getDegree();signals:void updateDegree();
protected:void mousePressEvent(QMouseEvent *event);void mouseMoveEvent(QMouseEvent *event);void mouseReleaseEvent(QMouseEvent *event);void mouseToPosion(QMouseEvent *event);QSize sizeHint() const;QSize minimumSizeHint() const;
private:int degree;};#endif

以及该类的实现。

#include "whirlbutton.h"
#include <QPainter>
#include <QMouseEvent>
#include <math.h>whirlbutton::whirlbutton()
{//   setMouseTracking(true);
    setSizePolicy(QSizePolicy::Minimum,QSizePolicy::Minimum);degree = 90;
}whirlbutton::~ whirlbutton()
{
}void whirlbutton::setDegree(int deg)
{this->degree = deg;this->update();
}
void whirlbutton::paintEvent(QPaintEvent *event)
{QPainter painter(this);QTransform tranform1;int originY = whirlbuttonHeigth/2;int originX = whirlbuttonWidth/2;const int triangle[3][2] ={{ originX-2, 0 },{ originX+2, 0 },{ originX, 7 }};painter.setPen(QPen(Qt::red));//painter.setBrush(palette().foreground());
    painter.setBrush(QBrush(Qt::red));//draw polygon,triangle.painter.drawPolygon(QPolygon(3, &triangle[0][0]));//   painter.setWindow(0,0,150,150);
    tranform1.translate(originX,originY);tranform1.rotate(degree);tranform1.translate(-(originX),-(originY));painter.setWorldTransform(tranform1);QPen thickPen(palette().foreground(), 1.5);QPen midPen(palette().foreground(), 1.0);QPen thinPen(palette().foreground(), 0.5);QColor niceBlue(150, 150, 200);painter.setPen(thinPen);//gradually change with degreeQConicalGradient coneGradient(originX, originY, -90.0);coneGradient.setColorAt(0.0, Qt::darkGray);coneGradient.setColorAt(0.2, niceBlue);coneGradient.setColorAt(1.0, Qt::white);coneGradient.setColorAt(1.0, Qt::darkGray);unsigned r = 56;painter.setBrush(coneGradient);painter.drawEllipse((originX-r), (originY-r), r*2, r*2);r = 24;QRadialGradient haloGradient(originX, originY, r, originX, originY);haloGradient.setColorAt(0.0, Qt::lightGray);haloGradient.setColorAt(0.8, Qt::darkGray);haloGradient.setColorAt(0.9, Qt::white);haloGradient.setColorAt(1.0, Qt::black);painter.setPen(Qt::NoPen);painter.setBrush(haloGradient);painter.drawEllipse(originX-r, originY-r, r*2, 2*r);unsigned rx = 30,ry = 8;QLinearGradient knobGradient(originX-rx, originY-ry,originX-rx, originY+ry);knobGradient.setColorAt(0.0, Qt::black);knobGradient.setColorAt(0.2, niceBlue);knobGradient.setColorAt(0.3, Qt::lightGray);knobGradient.setColorAt(0.8, Qt::white);knobGradient.setColorAt(1.0, Qt::black);painter.setBrush(knobGradient);painter.setPen(thinPen);painter.drawRoundRect(originX-rx,originY-ry, rx*2, ry*2, 49, 99);for (int i = 0; i < 36; ++i){if (i%6){painter.setPen(midPen);painter.drawLine(5,originY, 10,originY);}else{painter.setPen(thickPen);painter.drawLine(5,originY, 13,originY);tranform1.translate(25,originY);tranform1.rotate(-90);tranform1.translate(-25,-originY);painter.setWorldTransform(tranform1);painter.drawText(22, originY,QString::number(i/6));tranform1.translate(25,originY);tranform1.rotate(90);tranform1.translate(-25,-originY);painter.setWorldTransform(tranform1);}tranform1.translate(originX,originY);tranform1.rotate(-10);tranform1.translate(-originX,-originY);painter.setWorldTransform(tranform1);}
}
QSize whirlbutton::sizeHint() const
{QSize size = QSize(whirlbuttonHeigth,whirlbuttonWidth);return size;
}
QSize whirlbutton::minimumSizeHint() const
{QSize size = QSize(whirlbuttonHeigth,whirlbuttonWidth);return size;
}
void whirlbutton::mousePressEvent(QMouseEvent *event)
{mouseToPosion(event);this->update();
}
int whirlbutton :: getDegree()
{return(degree);
}
void whirlbutton::mouseMoveEvent(QMouseEvent * event)
{mouseToPosion(event);this->update();
}
void whirlbutton::mouseReleaseEvent(QMouseEvent * event)
{mouseToPosion(event);this->updateDegree();
}
void whirlbutton:: mouseToPosion(QMouseEvent * event)
{QPoint currentPoint = event->pos();double pi = 3.1415927;double  x = currentPoint.x() - whirlbuttonHeigth/2;double  y = currentPoint.y() - whirlbuttonWidth/2;if((x ==0)&&(y<=0))degree = 90;else if((x==0)&&(y<0))degree = 270;else if(x>0)degree = atan(y/x)*180/pi + 180;else if(y>0)degree = atan(y/x)*180/pi + 360;elsedegree = atan(y/x)*180/pi;
}

原文地址:http://www.cnblogs.com/hebaichuanyeah/p/6083445.html

Qt自定义/绘制旋钮控件相关推荐

  1. Qt 自定义信号强度显示控件

    效果图 QWidget自定义信号强度显示控件,比较简单,适合初学者. 主要就是继承于QWidget, 重写paintEvent以绘制: 源码如下: signalwidget.h #ifndef SIG ...

  2. C#在控件中绘制矩形、圆、线段等(切换不同的图片,自定义翻页控件,通过委托监控某个字段)

    1.效果展示 2 自定义翻页控件 public partial class PageManagemen : UserControl{/// <summary>/// 当前页(从1开始计数) ...

  3. Winform中实现自定义水晶按钮控件(附代码下载)

    场景 效果 注: 博客主页: https://blog.csdn.net/badao_liumang_qizhi 关注公众号 霸道的程序猿 获取编程相关电子书.教程推送与免费下载. 实现 新建一个用户 ...

  4. 使用Windows窗体的C#旋钮控件

    目录 介绍 属性 下载KnobControlProject-1 MB 介绍 该代码最初是由Jigar Desai很久以前写的,作为概念的证明.(此控件的原始文章可以在C-SharpCorner.com ...

  5. Android在Activity中动态增加xml自定义样式布局控件(引用xml布局文件和循环增加控件)

    工程目录: MainActivity package com.example.test1121;import androidx.appcompat.app.ActionBar; import andr ...

  6. 自定义 View 歌词控件

    Yuan-LrcView 项目地址:jsyjst/Yuan-LrcView 简介: 自定义 View 歌词控件 更多:作者   提 Bug 标签: 简约风的歌词控件,如果对具体实现感兴趣的可以看这篇文 ...

  7. 自定义View和控件

    自定义View和控件 控件 把已经存在的控件组合在一起当做一个控件来用 自定义View 创新 ,之前没有的控件 源码的关联 删除private jar 添加到build path 选中jar包的可用 ...

  8. Angular19 自定义表单控件

    1 需求 当开发者需要一个特定的表单控件时就需要自己开发一个和默认提供的表单控件用法相似的控件来作为表单控件:自定义的表单控件必须考虑模型和视图之间的数据怎么进行交互 2 官方文档 -> 点击前 ...

  9. C# Winform 通过FlowLayoutPanel及自定义的编辑控件,实现快速构建C/S版的编辑表单页面...

    个人理解,开发应用程序的目的,不论是B/S或是C/S结构类型,无非就是实现可供用户进行查.增.改.删,其中查询用到最多,开发设计的场景也最为复杂,包括但不限于:表格记录查询.报表查询.导出文件查询等等 ...

最新文章

  1. 利用Javadoc工具生成api文档
  2. Jenkins构建Docker容器
  3. 读取xml文件基于xpath
  4. crashdumpandroid_Android 中Crash时如何获取异常信息详解及实例
  5. 解决IntelliJ IDEA报错:调用方法[manageApp]时发生异常java.lang.IllegalStateException: 启动子级时出错
  6. input发送a.jax_Java REST JAX-RS 2.0 –如何处理日期,时间和时间戳记数据类型
  7. Linux远程管理工具(PuTTY和SecureCRT)
  8. html file 隐藏,input type=file /浏览时只显示指定文件类型(html5新特性)
  9. 布局文件中出现的错误
  10. Spring学习总结(16)——Spring AOP实现执行数据库操作前根据业务来动态切换数据源
  11. oledb驱动Oracle,Oracle学习笔记:手工注册oracle的oledb驱动 | 学步园
  12. EtherCAT主站SOEM函数详解----SDO读写函数
  13. EndNote20 for Mac 与搭载Apple M1芯片Mac版Word不兼容的解决方案(新发布的EndNote 20.1更新版可适配Apple M1)
  14. 微信公众号自定义分享踩坑
  15. Mixpanel获Andreessen Horowitz投资 为Viddy及Path提供分析服务
  16. 没想到你们是这样的女生……
  17. 有关H5第二章排列页面内容介绍
  18. Centos 系统折腾
  19. 模电学习笔记(八)——差分放大器
  20. 任务卡_05-数据库_-MySql 高级任务

热门文章

  1. 微信检测软件,检测的结果准不准确?
  2. jpcsp源码解读9:指令的抽象描述与指令的译码
  3. html5花瓣掉落素材,html5 - 花瓣散落效果怎么写 怎么生成好多花瓣
  4. 棋牌游戏用户流失预测——Xgboost调参
  5. 【Qt5开发及实例】20、实现一个飞舞的蝴蝶
  6. C语言进阶(十四) - 文件管理
  7. oracle拼音排序
  8. c语言勤工助学信息管理系统,我校勤工助学管理系统上线运行
  9. 斯坦福大学和芝加哥大学招生官解读招生政策
  10. MySQL --- 窗口函数