Qt编写自定义控件:像素刻度尺
代码:
#ifndef RULERWIDGET_H
#define RULERWIDGET_H#include <QWidget>class RulerWidget : public QWidget
{Q_OBJECTpublic:RulerWidget(Qt::Orientations orientation, QWidget *parent = nullptr);~RulerWidget()override;protected:void paintEvent(QPaintEvent *event)override;private:QColor backgroundColor{Qt::white};//背景色QColor textAndLineColor{"#606060"};//文本和刻度颜色Qt::Orientations orientation;QFont font{"微软雅黑",18};
};#endif // RULERWIDGET_H
#include "rulerwidget.h"
#include <QPainter>
#include <QPaintEvent>RulerWidget::RulerWidget(Qt::Orientations orientation,QWidget *parent): QWidget(parent),orientation(orientation)
{orientation == Qt::Horizontal ? setMinimumHeight(100) : setMinimumWidth(100);
}RulerWidget::~RulerWidget()
{
}void RulerWidget::paintEvent(QPaintEvent *event)
{auto rect = event->rect();QPainter painter(this);painter.setRenderHint(QPainter::Antialiasing);painter.fillRect(rect,backgroundColor);//绘制刻度painter.save();auto length = (orientation == Qt::Horizontal ? rect.width() : rect.height());painter.setPen(QPen(textAndLineColor,1));painter.setFont(font);if(orientation == Qt::Horizontal){auto height = rect.height();auto shortLine_y = height * 0.75;auto longLine_y = height * 0.5;auto middleLine_y = height * 0.625;auto halfHeight = height / 2;int temp = 0;for(int i = 0;i < length;i+=10){if(temp % 10 == 0)//画长线{painter.drawLine(QPointF(i,middleLine_y),QPointF(i,height));}else if(temp % 5 == 0){painter.drawLine(QPointF(i,longLine_y),QPointF(i,height));painter.drawText(QRectF(i-50,0,100,halfHeight),Qt::AlignCenter | Qt::TextWordWrap,QString::number(i));}else{painter.drawLine(QPointF(i,shortLine_y),QPointF(i,height));}++temp;}}else{auto width = rect.width();auto shortLineWidth = width * 0.25;auto longLineWidth = width * 0.5;auto middleLineWidth = width * 0.375;auto harfWidth = width / 2;int temp = 0;for(int i = 0;i < length;i+=10){if(temp % 10 == 0)//画长线{painter.drawLine(QPointF(middleLineWidth,i),QPointF(0,i));}else if(temp % 5 == 0){painter.drawLine(QPointF(longLineWidth,i),QPointF(0,i));painter.drawText(QRectF(harfWidth,i-50,harfWidth,100),Qt::AlignCenter | Qt::TextWordWrap,QString::number(i));}else{painter.drawLine(QPointF(shortLineWidth,i),QPointF(0,i));}++temp;}}painter.restore();QWidget::paintEvent(event);
}
使用时在构造函数里指定方向:
RulerWidget w(Qt::Vertical);RulerWidget w2(Qt::Horizontal);
效果:
Qt编写自定义控件:像素刻度尺相关推荐
- Qt编写自定义控件29-颜色选取面板
一.前言 这个控件主要是模仿QColorDialog对话框中的颜色选取面板,提供一个十字形状的标识器,鼠标按下开始选取颜色,移动到哪就选择该处的颜色值,对应右侧颜色条放大显示,本控件的难点就是如何绘制 ...
- Qt编写自定义控件3-速度仪表盘
前言 速度仪表盘,写作之初的本意是用来展示当前测试的网速用的,三色圆环+数码管显示当前速度,Qt自带了数码管控件QLCDNumber,直接集成即可,同时还带有动画功能,其实也可以用在汽车+工业领域等, ...
- Qt编写自定义控件14-环形进度条
前言 环形进度条,用来展示当前进度,为了满足大屏UI的需要特意定制,以前有个叫圆环进度条,不能满足项目需要,只能重新定做,以前的进度间距不能自适应分辨率,而且当前进度对应的反的进度不能单独设置颜色,即 ...
- Qt编写自定义控件4-旋转仪表盘
前言 旋转仪表盘,一般用在需要触摸调节设置值的场景中,其实Qt本身就提供了QDial控件具有类似的功能,本控件最大的难点不在于绘制刻度和指针等,而在于自动计算当前用户按下处的坐标转换为当前值,这个功能 ...
- Qt编写自定义控件44-天气仪表盘
一.前言 天气仪表盘控件是所有控件中唯一一个使用了svg矢量图的控件,各种天气图标采用的矢量图,颜色变换采用动态载入svg的内容更改生成的,其实也可以采用图形字体来做,本次控件为了熟悉下svg在Qt中 ...
- Qt编写自定义控件35-GIF录屏控件
一.前言 在平时的写作过程中,经常需要将一些操作动作和效果图截图成gif格式,使得涵盖的信息更全面更生动,有时候可以将整个操作过程和运行效果录制成MP4,但是文件体积比较大,而且很多网站不便于上传,基 ...
- Qt编写自定义控件及插件的使用
在使用Qt Designer设计窗体界面时,我们可以使用Widget Box里的窗体控件非常方便的绘制界面,比如拖进去一个按钮,一个文本编辑器等.虽然Qt Designer里的控件可以满足我们大部分的 ...
- Qt编写自定义控件21-圆弧仪表盘
一.前言 圆弧仪表盘在整个自定义控件大全中也稍微遇到了技术难点,比如背景透明,如果采用以前画圆形画扇形的方式绘制,肯定很难形成背景透明,需要用到切割,最后换了一种绘制方法,采用绘制圆弧的方式,即使用d ...
- Qt编写自定义控件1-汽车仪表盘
一.前言 汽车仪表盘几乎是qt写仪表盘控件中最常见的,一般来说先要求美工做好设计图,然后设计效果图给到程序员,由程序员根据效果来实现,主要靠贴图,这种方法有个好处就是做出来的效果比较逼真,和真实效果图 ...
最新文章
- 怎么安装MYSQL5.0的JDBC驱动
- 吐血整理:24种可视化图表优缺点对比,一图看懂!
- 《从问题到程序:用Python学编程和计算》——3.4 定义函数
- POJ 3225 Help with Intervals(线段树)
- zynq 文件系统中加载PL fpga.bit笔记
- 天翼云从业认证(4.10)网络直播场景解决方案(CDN)
- 操作系统之进程管理:9、进程互斥的硬件实现方法
- 我的世界服务器物品解绑定,我的世界更方便控制VIP物品 灵魂绑定插件分享
- Function的常用属性和方法
- python 正则表达式 \b 大坑
- 采购订单暂存和持有相关的问题?
- R语言安装及包的使用
- matlab卷积神经网络的创建与图片识别
- 超实用的桌面收纳盒!
- Excel中忽视隐藏行编序号
- Spring整合axis2
- 纳德拉:没有Excel的世界是无法想象的
- java生成唯一订单号
- 复旦女神陈果:孤独是一个人的狂欢,在你寂寞时请关注这些公众号充实自己
- java游戏 天剑传承,《天剑传承》之无双迷宫攻略