Qwt QwtKnob绘制旋钮

news2025/1/11 21:04:32

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_OBJECT
    Q_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; // spacing

    return 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; // spacing

    m_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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1179189.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

UseGalaxy.cn生信云|生物信息必备技能-出版级别的circos圈图绘制

2023-11-06&#xff0c;Galaxy生信云平台 UseGalaxy.cn 新增circos圈图绘制工具。 Graph/Display Data Circos visualizes data in a circular layout (Galaxy Version 0.69.8galaxy12) Circos&#xff08;Krzywinski等人&#xff0c;2009年&#xff09;是一个用于以圆形布局可…

lv10 嵌入式开发 在线英英词典

1 有道词典流程分析及本项目功能描述 1.1 抽取项目原理分析 本项目功能描述 用户注册和登录验证服务器端将用户信息和历史记录保存在数据库中。客户端输入用户名和密码&#xff0c;服务器端在数据库中查找、匹配&#xff0c;返回结果单词在线翻译根据客户端输入的单词在字典文…

项目实战:组件扫描实现(1)-扫描类路径所有文件

1、ComponentScan 组件扫描类 一下知识本人都是在Maven工程下总结的&#xff0c;所以目录结构会不一样这个类的作用是扫描所有的classes目录下的所有的字节码文件&#xff0c;找到相应的类&#xff0c;然后找到相应类上的注解 package com.csdn.mymvc.core; import java.io.Fi…

Single-cell 10x Cell Ranger analysis

first step download SRR data #这是批量下载 nohup prefetch -X 100GB --option-file SRR_Acc_List.txt & nohup fastq-dump --gzip --split-files -A ./SRR13633760 -O /home/scRNA/ &next Build a custom reference using Cell Ranger mkref 首先&#xff0c;找…

音视频技术开发周刊 | 318

每周一期&#xff0c;纵览音视频技术领域的干货。 新闻投稿&#xff1a;contributelivevideostack.com。 日程揭晓&#xff01;速览深圳站大会专题议程详解 LiveVideoStackCon 2023 音视频技术大会深圳站&#xff0c;保持着往届强大的讲师阵容以及高水准的演讲质量。两天的参会…

selenium自动化测试入门 —— 层级定位与定位一组元素

一、层级定位(二次定位) 在实际测试过程中&#xff0c;一个页面可能有多个属性基本相同的元素&#xff0c;如果要定位到其中的一个&#xff0c;这时候需要用到层级定位。先定位其父元素&#xff0c;然后再通过父元素定位该元素。 示例&#xff1a;通过层级定位搜狗输入框 dr…

Mac版eclipse如何安装,运行bpmn文件

一、下载程序包 网址&#xff1a;https://www.eclipse.org/downloads M2芯片安装包名称&#xff1a;eclipse-jee-2022-12-R-macosx-cocoa-aarch64.dmg 具体安装包版本根据自己电脑型号选择 二、eclipse安装步骤 1&#xff09;双击下载的文件 2&#xff09;将eclipse拖入到…

京东大数据:2023年Q3美妆行业数据分析报告

近日&#xff0c;珀莱雅发布三季报&#xff0c;今年前三季度&#xff0c;公司实现营收52.49亿元&#xff0c;同比增长32.47%。分季度看&#xff0c;“618大促”所在Q2业绩增长最为亮眼&#xff0c;营收同比增速达到46.22%&#xff0c;进入Q3&#xff0c;在电商大促缺席情况下&a…

Python---字符串的修改方法---split()方法--切割

split()方法 split 英 /splɪt/ v. 分裂&#xff0c;使分裂&#xff08;成不同的派别&#xff09;&#xff1b;分开&#xff0c;使分开&#xff08;成为几个部份&#xff09;&#xff1b;&#xff08;使&#xff09;撕裂&#xff1b;分担&#xff0c;分享&#xff1b;划破…

Linux:进程控制的概念和理解

文章目录 进程的创建fork函数写时拷贝的原理fork函数的用法和失败原因 进程终止进程的退出进程异常的问题 进程终止进程退出 进程等待什么是进程等待&#xff1f;为什么要进行进程等待&#xff1f;如何进行进程等待&#xff1f;父进程如何知道子进程的退出信息&#xff1f; wai…

element的表单校验证件号规则以及输入“无”的情况校验通过

element的表单校验证件号规则以及输入“无”的情况校验通过 <el-col :span"6"><el-form-item label"证件号码" prop"Idnumber" class"grid-content bg-purple"><el-input v-model"testForm.Idnumber" placeh…

Spark Core

Spark Core 本文来自 B站 黑马程序员 - Spark教程 &#xff1a;原地址 第一章 RDD详解 1.1 为什么需要RDD 分布式计算需要 分区控制shuffle控制数据存储、序列化、发送数据计算API等一系列功能 这些功能&#xff0c;不能简单的通过Python内置的本地集合对象&#xff08;如…

如何使用VSCode来查看二进制文件

2023年11月6日&#xff0c;周一下午 目录 方法1&#xff1a;安装插件Binary Viewer然后用vscode打开一个二进制文件&#xff0c;并点击右上角的"HEX"方法2&#xff1a;安装插件Binary然后用vscode打开一个二进制文件&#xff0c;并点击右上角的"B" 方法1&…

如何使用群晖NAS的Audio Station结合内网穿透实现远程访问本地曲库

文章目录 本教程解决的问题是&#xff1a;按照本教程方法操作后&#xff0c;达到的效果是本教程使用环境&#xff1a;1 群晖系统安装audiostation套件2 下载移动端app3 内网穿透&#xff0c;映射至公网 很多老铁想在上班路上听点喜欢的歌或者相声解解闷儿&#xff0c;于是打开手…

Webpack 中 loader 的作用是什么?常用 loader 有哪些?

说说webpack中常见的Loader&#xff1f;解决了什么问题&#xff1f;- 题目详情 - 前端面试题宝典 1、loader 是什么 loader是 webpack 最重要的部分之一。 通过使用不同的 loader&#xff0c;我们能够调用外部的脚本或者工具&#xff0c;实现对不同格式文件的处理。 loader…

汽车电子中的深力科推荐一款汽车用功率MOSFET NVTFS6H888NLTAG N沟道

NVTFS6H888NLTAG MOSFET是符合AEC-Q101标准的汽车用功率MOSFET&#xff0c;采用WDFN-8封装&#xff0c;实现紧凑设计。具有低QG和电容&#xff08;最大限度地降低驱动器损耗&#xff09;和低 RDS(on)&#xff08;降低传导损耗&#xff09;。还提供可湿性侧翼选项&#xff0c;用…

OpenSign 开源 PDF 电子签名解决方案

OpenSign 是一个开源文档电子签名解决方案&#xff0c;旨在为 DocuSign、PandaDoc、SignNow、Adobe Sign、Smartwaiver、SignRequest、HelloSign 和 Zoho Sign 等商业平台提供安全、可靠且免费的替代方案。 特性&#xff1a; 安全签名&#xff1a;利用最先进的加密算法来确保…

Python 使用Scapy构造特殊数据包

Scapy是一款Python库&#xff0c;可用于构建、发送、接收和解析网络数据包。除了实现端口扫描外&#xff0c;它还可以用于实现各种网络安全工具&#xff0c;例如SynFlood攻击&#xff0c;Sockstress攻击&#xff0c;DNS查询攻击&#xff0c;ARP攻击&#xff0c;ARP中间人等。这…

Akshare获取同花顺行业

使用akshare可以很方便的获取同花顺行业列表&#xff0c;与每个行业对应的个股信息&#xff0c;流程如下&#xff1a; 使用ak.stock_board_industry_summary_ths()获取行业列表循环行业列表&#xff0c;使用ak.stock_board_industry_cons_ths()获取行业对应的个股信息 官方文…

工厂模式 rust和java的实现

文章目录 工厂模式特点介绍工厂模式包含以下几个核心角色&#xff1a;实现架构java 实现rust实现rust代码仓库 工厂模式 工厂模式&#xff08;Factory Pattern&#xff09;是最常用的设计模式之一。这种类型的设计模式属于创建型模式&#xff0c;它提供了一种创建对象的最佳方…