QT学习之漂亮的时钟秀


效果图
截图展示
代码如下
dialog.h
#ifndef DIALOG_H
#define DIALOG_H

#include

QT_BEGIN_NAMESPACE
namespace Ui { class Dialog; }
QT_END_NAMESPACE

class Dialog : public QDialog
{
Q_OBJECT

public:
Dialog(QWidget *parent = nullptr);
~Dialog();
void draw(QPainter *painter);
protected:
void paintEvent(QPaintEvent *event);

private:
Ui::Dialog *ui;
};
#endif // DIALOG_H

dialog.cpp

#include “dialog.h”
#include “ui_dialog.h”
#include “QTimer”
#include “QTime”
#include “QPainter”
#include “QDebug”

Dialog::Dialog(QWidget *parent)
QDialog(parent)
, ui(new Ui::Dialog)
{
QTimer *timer = new QTimer(this);
connect(timer,SIGNAL(timeout()), this, SLOT(update()));
timer->start(1000);
setWindowTitle(tr(“Analog Clock”));
resize(200, 200);
ui->setupUi(this);

}

Dialog::~Dialog()
{
delete ui;
}
/void Clock::paintEvent(QPaintEvent event)
{
//下面三个数组用来定义表针的三个顶点,以便后面的填充
static const QPoint hourHand[3] = {
QPoint(3, 8),
QPoint(-3, 8),
QPoint(0, -40)
};
static const QPoint minuteHand[3] = {
QPoint(3, 8),
QPoint(-3, 8),
QPoint(0, -70)
};
static const QPoint secondHand[3] = {
QPoint(3, 8),
QPoint(-3, 8),
QPoint(0, -90)
};//秒针
//填充表针的颜色
QColor hourColor(127, 0, 127); //分针颜色(第四个表示不透明度)
QColor minuteColor(0, 127, 127, 191);
QColor secondColor(127, 127, 0, 127);
//…
}
/
void Dialog::paintEvent(QPaintEvent * /
event /)
{
//QPainter可以绘制从简单的直线到像饼图和弦这样的复杂形状。它也可以绘制排列的文本和像素映射。
QPainter painter(this);
//由于反走样需要比较复杂的算法,在一些对图像质量要求不是很高的应用中,是不需要进行反走样的。
//为了提高效率,一般的图形绘制系统,都是默认不进行反走样的。
//QPainter::Antialiasing 告诉绘图引擎应该在可能的情况下进行边的反锯齿绘制
painter.setRenderHint(QPainter::Antialiasing, true);
//通过设置窗口或视口矩形,执行一个线性变换的坐标。注意:每个窗口的角落映射到相应的视口的角落,
//反之亦然。因此,这通常是一个好方法,让视口和窗口保持相同的长宽比,防止变形:
int side = qMin(width(), height());
//qDebug() << “width()” << width() << endl;
//qDebug() << “height()” << height() << endl;
//qDebug() << “side” << side << endl;
painter.setViewport((width() - side) / 2, (height() - side) / 2,
side, side);
painter.setWindow(0, 0, 200, 200);/设置(0,0)为新的坐标原点/
draw(&painter);
}
void Dialog::draw(QPainter painter)
{
static const QPoint hour[3] = {
QPoint(3, 8),
QPoint(-3, 8),
QPoint(0, -40)
};
static const QPoint min[3] = {
QPoint(3, 8),
QPoint(-3, 8),
QPoint(0, -70)
};
static const QPoint sed[3] = {
QPoint(3,8),
QPoint(-3,8),
QPoint(0, -90)
};//秒针
QPen thickPen(palette().foreground(), 3.5);//设置刻度线为粗黑
QPen thinPen(palette().foreground(), 1.5);//设置刻度线为灰
QTime time = QTime::currentTime();
painter->translate(100,100);//重新设定坐标原点
QString timeStr= QTime::currentTime().toString(); //绘制当前的时间
painter->drawText(-40,30,80,30,Qt::AlignHCenter | Qt::AlignTop, timeStr);
painter->setRenderHint(QPainter::Antialiasing);//消锯齿
painter->setBrush(Qt::red);
painter->setPen(Qt::red);
painter->save();//保存坐标系,防止坐标系跑偏了
painter->rotate(6.0
time.second());//注意是6.0,不是6
painter->drawConvexPolygon(sed,3);//绘制秒指针
painter->restore();//复位之前的坐标系
painter->setBrush(Qt::blue);
painter->setPen(Qt::blue);
painter->save();
painter->rotate(6.0
(time.minute()+time.second()/60.0));
painter->drawConvexPolygon(min,4);
painter->restore();
painter->setBrush(Qt::black);
painter->setPen(Qt::black);
painter->save();
painter->rotate(30.0*(time.hour()+time.minute()/60.0));
painter->drawConvexPolygon(hour,4);
painter->restore();
painter->drawLine(0,-98,0,-88);
for(int i=0;i<12;i++)
{
// painter->rotate(30);//坐标轴旋转30度
// painter->drawLine(0,-98,0,-88);
// }
/画刻度还有数字/
for (int i = 1; i <=60; ++i) {
painter->save();
painter->rotate(6*i);//坐标轴旋转6度
if (i % 5 == 0) {
painter->setPen(thickPen);
painter->drawLine(0, -98, 0, -82);
painter->drawText(-20, -82, 40, 40,
Qt::AlignHCenter | Qt::AlignTop,
QString::number(i/5));
} else {
painter->setPen(thinPen);
painter->drawLine(0, -98, 0, -88);
}
//painter->rotate(-DegreesPerMinute);
painter->restore();
}
}
}
main.cpp
#include “dialog.h”

#include

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Dialog w;
w.show();
return a.exec();
}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值