当前位置: 首页 > news >正文

Qwt QwtKnob绘制旋钮

1.简介

QwtKnob是Qwt库中的一个类,用于绘制一个旋钮样式的仪表盘。它继承QwtAbstractSlider类,提供了一些额外的功能和样式,用于旋转和选择值。

以下是类继承关系:

2.常用方法

旋钮(Knob)相关的属性和方法:

  • void setKnobStyle(KnobStyle style) 设置旋钮的样式,如圆形、凹形、凸形等。
  • KnobStyle knobStyle() const 返回旋钮的样式。
  • void setKnobWidth(int width) 设置旋钮的宽度。
  • int knobWidth() const 返回旋钮的宽度。

void setScale (const QwtScaleDiv & scaleDiv) 设置范围

void setValue (double value) 设置当前值

void setBorderWidth (int borderWidth) 设置边框宽

标记相关的属性和方法:

void setMarkerStyle (MarkerStyle markerStyle) 设置标记样式

void setMarkerSize (int size) 设置标记大小

3.示例

#pragma once#include "qwt_global.h"
#include <QWidget>class QwtKnob;
class QLabel;class Knob : public QWidget
{Q_OBJECTQ_PROPERTY( QColor theme READ theme WRITE setTheme )public:Knob( const QString& title,double min, double max, QWidget* parent = NULL );virtual QSize sizeHint() const QWT_OVERRIDE;//设置当前值void setValue( double value );double value() const;//设置颜色void setTheme( const QColor& );QColor theme() const;Q_SIGNALS:double valueChanged( double );protected:virtual void resizeEvent( QResizeEvent* ) QWT_OVERRIDE;private:QwtKnob* m_knob = nullptr;QLabel* m_label = nullptr;
};#include "Knob.h"
#include "qwt_math.h"
#include "qwt_knob.h"
#include "qwt_round_scale_draw.h"
#include "qwt_scale_engine.h"#include <QLabel>
#include <QResizeEvent>
#include <qmath.h>Knob::Knob( const QString& title, double min, double max, QWidget* parent ): QWidget( parent )
{QFont font( "Helvetica", 10 );m_knob = new QwtKnob( this );//设置字体m_knob->setFont( font );QwtScaleDiv scaleDiv =m_knob->scaleEngine()->divideScale( min, max, 5, 3 );QList< double > ticks = scaleDiv.ticks( QwtScaleDiv::MajorTick );if ( ticks.size() > 0 && ticks[0] > min ){if ( ticks.first() > min )ticks.prepend( min );if ( ticks.last() < max )ticks.append( max );}//设置刻度scaleDiv.setTicks( QwtScaleDiv::MajorTick, ticks );//设置范围m_knob->setScale( scaleDiv );//设置旋钮宽度m_knob->setKnobWidth( 50 );//设置旋钮样式m_knob->setKnobStyle(QwtKnob::Raised);//m_knob->setKnobWidth(1);//设置标记风格m_knob->setMarkerStyle(QwtKnob::Nub);//设置标记大小m_knob->setMarkerSize(8);//设置边框宽度m_knob->setBorderWidth(2);font.setBold( true );m_label = new QLabel( title, this );m_label->setFont( font );m_label->setAlignment( Qt::AlignTop | Qt::AlignHCenter );setSizePolicy( QSizePolicy::MinimumExpanding,QSizePolicy::MinimumExpanding );connect( m_knob, SIGNAL(valueChanged(double)),this, SIGNAL(valueChanged(double)) );
}QSize Knob::sizeHint() const
{QSize sz1 = m_knob->sizeHint();QSize sz2 = m_label->sizeHint();const int w = qMax( sz1.width(), sz2.width() );const int h = sz1.height() + sz2.height();int off = qCeil( m_knob->scaleDraw()->extent( m_knob->font() ) );off -= 15; // spacingreturn QSize( w, h - off );
}void Knob::setValue( double value )
{m_knob->setValue( value );
}double Knob::value() const
{return m_knob->value();
}void Knob::setTheme( const QColor& color )
{m_knob->setPalette( color );
}QColor Knob::theme() const
{return m_knob->palette().color( QPalette::Window );
}void Knob::resizeEvent( QResizeEvent* event )
{const QSize sz = event->size();const QSize hint = m_label->sizeHint();m_label->setGeometry( 0, sz.height() - hint.height(),sz.width(), hint.height() );const int knobHeight = m_knob->sizeHint().height();int off = qCeil( m_knob->scaleDraw()->extent( m_knob->font() ) );off -= 15; // spacingm_knob->setGeometry( 0, m_label->pos().y() - knobHeight + off,sz.width(), knobHeight );
}

使用:

#include "KnobWidget.h"
#include "ui_KnobWidget.h"
#include "Knob.h"static QPalette colorTheme( const QColor& base )
{QPalette palette;palette.setColor( QPalette::Base, base );palette.setColor( QPalette::Window, base.darker( 150 ) );palette.setColor( QPalette::Mid, base.darker( 110 ) );palette.setColor( QPalette::Light, base.lighter( 170 ) );palette.setColor( QPalette::Dark, base.darker( 170 ) );palette.setColor( QPalette::Text, base.darker( 200 ).lighter( 800 ) );palette.setColor( QPalette::WindowText, base.darker( 200 ) );return palette;
}KnobWidget::KnobWidget(QWidget *parent) :QWidget(parent),ui(new Ui::KnobWidget)
{ui->setupUi(this);setPalette( colorTheme( QColor( Qt::darkGray ).darker( 70 ) ) );Knob *knob1 = new Knob( "Amplitude", 0.0, 200.0 );knob1->setValue( 160.0 );knob1->setTheme(QColor("#606060"));Knob *knob2 = new Knob( "Frequency [Hz]", 0.0, 20.0 );knob2->setValue( 17.8 );knob2->setTheme(QColor("#606060"));ui->horizontalLayout->addWidget(knob1);ui->horizontalLayout->addWidget(knob2);
}KnobWidget::~KnobWidget()
{delete ui;
}

相关文章:

Qwt QwtKnob绘制旋钮

1.简介 QwtKnob是Qwt库中的一个类&#xff0c;用于绘制一个旋钮样式的仪表盘。它继承QwtAbstractSlider类&#xff0c;提供了一些额外的功能和样式&#xff0c;用于旋转和选择值。 以下是类继承关系&#xff1a; 2.常用方法 旋钮&#xff08;Knob&#xff09;相关的属性和方法…...

docker部署elk

目录 前言 一、创建程序工作路径 二、创建私有网络 三、部署elasticsearch 1.先搜速后下载 2.创建一个基础的容器&#xff08;此步骤是为了拷贝容器里的文件&#xff09; 3.拷贝文件到宿主机 3.1进入容器 3.2拷贝并授权 3.3删除基础容器 4.创建容器 5.访问9200测试 …...

护网蓝队初级面试题摘录(下)

小王学习录 1.设备误报如何处理&#xff1f;2.讲一下TOP10都有哪些3.SQL注入的原理和漏洞产生的原因&#xff1f;4.SQL注入的类型盲注类型&#xff1a; 5.简单讲一下防范SQL注入的方法和原理6.SQL注入有哪些绕过姿势&#xff1f;7.SQL注入攻击有哪些危害&#xff1f;6.XSS&…...

通过51单片机控制SG90舵机按角度正反转转动

一、前言 本文介绍如何通过51单片机控制SG90舵机实现角度的正反转转动。SG90舵机是一种常用的微型舵机&#xff0c;具有体积小、重量轻、结构简单等特点&#xff0c;被广泛应用于机器人、遥控模型和各种自动控制系统中。 使用51单片机&#xff08;STC89C52&#xff09;作为控…...

uniapp写一个计算器用于记账(微信小程序,APP)

提要&#xff1a;自己用uniapp写了一个记账小程序&#xff08;目前是小程序&#xff09;&#xff0c;写到计算器部分&#xff0c;在网上找了别人写的计算器&#xff0c;大多数逻辑都是最简单的&#xff0c;都不能满足一个记账计算器的基本逻辑。与其在网上找来找去&#xff0c;…...

前端的几种网络请求方式

网络请求 node编写接口 这里用到的几个包的作用 express&#xff1a;基于 Node.js 平台&#xff0c;快速、开放、极简的 Web 开发框架&#xff0c;官网&#xff1a;https://www.expressjs.com.cn/cors&#xff1a;用来解决跨域问题body-parser&#xff1a;可以通过 req.body…...

Kubernetes技术与架构-存储 4

如上所示&#xff0c;Kubernetes集群支持动态申请存储资源&#xff0c;即集群管理员可以按照实际的需求动态地申请存储资源&#xff0c;集群管理员需要事先定义一个或者多个StorageClass存储类型的资源&#xff0c;Pod中的容器实例直接引用事先定义的StorageClass存储类型的资源…...

jbase编译与部署的优化

上一篇的演示只是涉及自动编译业务脚本。演示时候工程编译是超级慢的。因为把静态资源放在了Web工程下&#xff0c;每次编译都要拷贝&#xff0c;运行起码是1分钟&#xff0c;不能忍受&#xff0c;为此思考工程结构改解决这个问题&#xff0c;顺带方便开发的发布。运行WebLoade…...

Filter 和 Listener

Filter 表示过滤器。是JavaWeb三大组件&#xff08;Servlet、Filter、Listener&#xff09;之一。 过滤器可以把对资源的请求 拦截 下来。浏览器可以访问服务器上所有的资源&#xff0c;而在访问到这些资源之前可以使用过滤器拦截下来&#xff0c;也就是说在访问资源之前会先经…...

【正则表达式】中的“\b“

正则表达式是一种用于匹配字符串的强大工具&#xff0c;它可以用于各种编程语言中&#xff0c;可以用来在文本中查找、替换或验证符合某种规则的内容。 正则表达式中有很多特殊的符号&#xff0c;称为元字符&#xff0c;它们有着特殊的含义和作用。其中&#xff0c;“\b” 是其…...

FPGA高端项目:图像采集+GTP+UDP架构,高速接口以太网视频传输,提供2套工程源码加QT上位机源码和技术支持

目录 1、前言免责声明本项目特点 2、相关方案推荐我这里已有的 GT 高速接口解决方案我这里已有的以太网方案 3、设计思路框架设计框图视频源选择OV5640摄像头配置及采集动态彩条视频数据组包GTP 全网最细解读GTP 基本结构GTP 发送和接收处理流程GTP 的参考时钟GTP 发送接口GTP …...

数据库系统原理与实践 笔记 #7

文章目录 数据库系统原理与实践 笔记 #7数据库设计和E-R模型(续)转换为关系模式具有简单属性的实体集的表示复合属性多值属性联系集的表示模式的冗余—合并 实体-联系设计问题设计问题联系属性的布局 扩展的E-R特性特化概化属性继承特化/概化的设计约束聚集E-R图表示方法总结E-…...

【CesiumJS】(1)Hello world

介绍 Cesium 起源于2011年&#xff0c;初衷是航空软件公司(Analytical Graphics, Inc.)的一个团队要制作世界上最准确、性能最高且具有时间动态性的虚拟地球。取名"Cesium"是因为元素铯Cesium让原子钟非常准确&#xff08;1967年&#xff0c;人们依据铯原子的振动而对…...

Docker 学习路线 5:在 Docker 中实现数据持久化

Docker 可以运行隔离的容器&#xff0c;包括应用程序和其依赖项&#xff0c;与主机操作系统分离。默认情况下&#xff0c;容器是临时的&#xff0c;这意味着容器中存储的任何数据在终止后都将丢失。为了解决这个问题并在容器生命周期内保留数据&#xff0c;Docker 提供了各种数…...

linux下使用vscode对C++项目进行编译

项目的目录结构 头文件swap.h 在自定义的头文件中写函数的声明。 // 函数的声明 void swap(int a,int b);swap.cpp 导入函数的声明&#xff0c;写函数的定义 #include "swap.h" // 双引号表示自定义的头文件 #include <iostream> using namespace std;// 函…...

LangChain+LLM实战---ChatGPT的即时插件套件制作

英文原文&#xff1a;Instant Plugins for ChatGPT: Introducing the Wolfram ChatGPT Plugin Kit 在一分钟内构建一个新插件 几周前&#xff0c;我们与OpenAI合作发布了Wolfram插件&#xff0c;使ChatGPT可以使用Wolfram语言和Wolfram|Alpha作为工具&#xff0c;在ChatGPT内部…...

包装印刷行业万界星空科技云MES解决方案

印刷业的机械化程度在国内制造行业内算是比较高的&#xff0c;不算是劳动密集型企业。如书本的装订、包装的模切、烫金、糊盒等都已经有了全自动设备。印刷厂除了部分手工必须采用人工外&#xff0c;大部分都可以采用机器&#xff0c;也就意味着可以由少量工人生产出大量产品。…...

Python教程---计算机语言简介

1.计算机编程语言的发展历程 计算机语言发展经历了三个阶段&#xff1a; 机器语言 - 机器语言通过二进制编码来编写程序&#xff0c;打孔织带机。 - 执行效率好&#xff0c;编写起来太麻烦 符号语言&#xff08;汇编&#xff09; - 使用符号来代替机器码 - 编写程序时&#xf…...

rhcsa-文件内容显示

浏览普通文件内容 浏览文件的命令 命令常用选项说明cat -n 对输出内容中的所有行标注行号 -b 对输出内容中的非空行标注行号 查看文件的内容head-num 指定需要显示文件num行的内容默认查看文前十行的内容tail -num 指定需要显示文件num行的内容 -f 使tail不停的去读取显示文…...

宠物养成猫狗商城门店问诊档案流量主小程序开发

宠物养成猫狗商城门店问诊档案流量主小程序开发 猫狗宠物养成商城门店问诊档案流量主小程序开发&#xff0c;这是一个充满趣味性和创新性的项目。通过将宠物养成游戏与商城、问诊服务、社交功能等相结合&#xff0c;为用户提供一站式的宠物养育体验。 在宠物养成方面&#x…...

挑战杯推荐项目

“人工智能”创意赛 - 智能艺术创作助手&#xff1a;借助大模型技术&#xff0c;开发能根据用户输入的主题、风格等要求&#xff0c;生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用&#xff0c;帮助艺术家和创意爱好者激发创意、提高创作效率。 ​ - 个性化梦境…...

定时器任务——若依源码分析

分析util包下面的工具类schedule utils&#xff1a; ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类&#xff0c;封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz&#xff0c;先构建任务的 JobD…...

Java - Mysql数据类型对应

Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...

srs linux

下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935&#xff0c;SRS管理页面端口是8080&#xff0c;可…...

python如何将word的doc另存为docx

将 DOCX 文件另存为 DOCX 格式&#xff08;Python 实现&#xff09; 在 Python 中&#xff0c;你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是&#xff0c;.doc 是旧的 Word 格式&#xff0c;而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

优选算法第十二讲:队列 + 宽搜 优先级队列

优选算法第十二讲&#xff1a;队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...

【HarmonyOS 5】鸿蒙中Stage模型与FA模型详解

一、前言 在HarmonyOS 5的应用开发模型中&#xff0c;featureAbility是旧版FA模型&#xff08;Feature Ability&#xff09;的用法&#xff0c;Stage模型已采用全新的应用架构&#xff0c;推荐使用组件化的上下文获取方式&#xff0c;而非依赖featureAbility。 FA大概是API7之…...

PH热榜 | 2025-06-08

1. Thiings 标语&#xff1a;一套超过1900个免费AI生成的3D图标集合 介绍&#xff1a;Thiings是一个不断扩展的免费AI生成3D图标库&#xff0c;目前已有超过1900个图标。你可以按照主题浏览&#xff0c;生成自己的图标&#xff0c;或者下载整个图标集。所有图标都可以在个人或…...

Linux-进程间的通信

1、IPC&#xff1a; Inter Process Communication&#xff08;进程间通信&#xff09;&#xff1a; 由于每个进程在操作系统中有独立的地址空间&#xff0c;它们不能像线程那样直接访问彼此的内存&#xff0c;所以必须通过某种方式进行通信。 常见的 IPC 方式包括&#…...

基于小程序老人监护管理系统源码数据库文档

摘 要 近年来&#xff0c;随着我国人口老龄化问题日益严重&#xff0c;独居和居住养老机构的的老年人数量越来越多。而随着老年人数量的逐步增长&#xff0c;随之而来的是日益突出的老年人问题&#xff0c;尤其是老年人的健康问题&#xff0c;尤其是老年人产生健康问题后&…...