Qwt QwtKnob绘制旋钮

1.简介

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

以下是类继承关系:

Qwt QwtKnob绘制旋钮_第1张图片

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.示例

Qwt QwtKnob绘制旋钮_第2张图片

#pragma once

#include "qwt_global.h"
#include 

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 
#include 
#include 

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

你可能感兴趣的:(Qwt,qt,qwt,旋钮,QwtKnob)