
main.cpp
#include <QtWidgets>
#include "Widget.h"
int main(int argc, char *argv[])
{
QApplication app(argc,argv);
Widget w;
w.show();
return app.exec();
}
Widget类
Widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QtWidgets>
#include "Protractor.h"
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = nullptr);
protected:
signals:
private:
QSpinBox *greenSpin;
QSpinBox *redSpin;
Protractor *protractor;
int radius;
};
#endif
Widget.cpp
#include "Widget.h"
Widget::Widget(QWidget *parent) : QWidget(parent)
{
redSpin = new QSpinBox(this);
redSpin->setRange(0,180);
greenSpin = new QSpinBox(this);
greenSpin->setRange(0,180);
QSlider *redSlider = new QSlider(Qt::Horizontal,this);
redSlider->setRange(0,180);
connect(redSlider,&QSlider::valueChanged, redSpin, &QSpinBox::setValue);
connect(redSpin, QOverload<int>::of(&QSpinBox::valueChanged),redSlider,&QSlider::setValue);
QSlider *greenSlider = new QSlider(Qt::Horizontal,this);
greenSlider->setRange(0,180);
connect(greenSlider,&QSlider::valueChanged, greenSpin, &QSpinBox::setValue);
connect(greenSpin, QOverload<int>::of(&QSpinBox::valueChanged),greenSlider,&QSlider::setValue);
protractor = new Protractor(this);
connect(redSlider,&QSlider::valueChanged, protractor, &Protractor::redChanged);
connect(greenSlider,&QSlider::valueChanged, protractor, &Protractor::greenChanged);
QGridLayout *mainLayout = new QGridLayout(this);
mainLayout->addWidget(protractor,0,0,1,3);
QLabel *redLabel = new QLabel("红色指针");
redLabel->setAlignment(Qt::AlignCenter);
mainLayout->addWidget(redLabel ,1,0);
mainLayout->addWidget(redSlider,1,1);
mainLayout->addWidget(redSpin ,1,2);
QLabel *greenLabel = new QLabel("绿色指针");
greenLabel->setAlignment(Qt::AlignCenter);
mainLayout->addWidget(greenLabel,2,0);
mainLayout->addWidget(greenSlider,2,1);
mainLayout->addWidget(greenSpin ,2,2);
mainLayout->setColumnStretch(0,2);
mainLayout->setColumnStretch(1,1);
mainLayout->setColumnStretch(2,0);
redSlider->setValue(70);
greenSlider->setValue(130);
}
Protractor类
Protractor.h
#ifndef PROTRACTOR_H
#define PROTRACTOR_H
#include <QWidget>
class Protractor : public QWidget
{
Q_OBJECT
public:
explicit Protractor(QWidget *parent = nullptr);
protected:
void paintEvent(QPaintEvent *event) override;
public slots:
void redChanged(int red);
void greenChanged(int green);
signals:
private:
int m_red = 0;
int m_green = 0;
};
#endif
Protractor.cpp
#include "Protractor.h"
#include <QPainter>
Protractor::Protractor(QWidget *parent) : QWidget(parent)
{
this->setMinimumSize(800,400);
}
void Protractor::paintEvent(QPaintEvent *)
{
QPainter painter(this);
painter.fillRect(this->rect(),Qt::black);
painter.setRenderHints(QPainter::Antialiasing);
qreal raduis = width()/2.0;
painter.setPen(QPen(Qt::white,2));
QPointF zero(width()/2,height()-10);
painter.drawEllipse(zero,raduis * 0.8,raduis *0.8);
painter.drawEllipse(zero,raduis * 0.6,raduis *0.6);
painter.translate(zero);
painter.save();
QFontMetrics fm = this->fontMetrics();
for (int i = 0; i <= 180; ++i) {
if(i % 30 == 0){
painter.save();
painter.setPen(QPen(QColor(255,255,255,120),2,Qt::DashDotDotLine));
painter.drawLine( 0, 0, raduis * 0.8, 0 );
painter.restore();
}
if(i % 10 == 0) {
painter.drawLine( raduis * 0.8 ,0 , raduis * 0.8 - 20, 0 );
painter.drawLine( raduis * 0.6 ,0 , raduis * 0.6 - 20, 0 );
painter.save();
QString temp = QString("%1度").arg(i);
int tw = fm.horizontalAdvance(temp);
int th = fm.height();
painter.translate(raduis * 0.8 + tw/2+10, 0);
painter.rotate(i);
painter.drawText(-tw/2,th/2,QString("%1度").arg(i));
painter.restore();
}
else {
painter.drawLine( raduis * 0.8 ,0 , raduis * 0.8 - 10, 0 );
painter.drawLine( raduis * 0.6 ,0 , raduis * 0.6 - 10, 0 );
}
painter.rotate(-1);
}
painter.restore();
painter.save();
painter.rotate(-m_red);
painter.setPen(QPen(Qt::red,2));
painter.drawLine(0,0, raduis * 0.8 + 10, 0);
painter.restore();
painter.save();
painter.rotate(- m_green);
painter.setPen(QPen(Qt::green,2));
painter.drawLine(0,0, raduis * 0.6 + 10, 0);
painter.restore();
}
void Protractor::redChanged(int red)
{
m_red = red;
update();
}
void Protractor::greenChanged(int green)
{
m_green = green;
update();
}