1.将一个控件封装成类
1.先在widget.h和widget.c里面实现这个控件的功能以及绘制好这个控件的ui
2.右键新建一个C++ Class类,假如取名MyClock,继承基类选择QWidget(空间类就应该继承Widget类),
再引入头文件QWidget
3.将widget.h的头文件(绘制控件需要的)剪切到myclock.h中
4.将widget.h类体中的一部分剪切到myclock.h中
包括用到的成员变量,成员函数,槽函数
5.将widget.c中的里面函数的实现剪切过来,并且改类名!!!改类名!!!该类名为
eg:
void Widget::timeOut(){...}---->void MyColock::timeOut(){...}
6.将widget.c的构造函数里面的自己写的内容,剪切到mycolock.c的构造函数中
7.在widget.h中引入mycolock.h头文件
#include "mycolock.h"
8.使用:
在widget.h定义一个成员指针:
private:
MyColock *colock;
在widget.c里构造控件
colock = new MyColock(this);
----------------------------------------------------------------------------------------
或者一开始就引入mycolock.h和mycolock.c直接在里面实现控件功能,然后引入头文件即可
eg:将时钟封装成一个控件:
mycolock.h
#ifndef MYCOLOCK_H
#define MYCOLOCK_H
#include <QWidget>
#include <QPainter>
#include <QPen>
#include <QBrush>
#include <QPaintEvent>
#include <QTimer>
class MyColock : public QWidget
{
Q_OBJECT
public:
explicit MyColock(QWidget *parent = nullptr);
void paintEvent(QPaintEvent *);
private slots:
void timeOut();
private:
QTimer *time;
double count = 0;
};
#endif
mycolock.c
#include "mycolock.h"
MyColock::MyColock(QWidget *parent) : QWidget(parent)
{
time = new QTimer(this);
connect(time, &QTimer::timeout, this, &MyColock::timeOut);
time->start(1000);
}
void MyColock::paintEvent(QPaintEvent *)
{
QPainter p(this);
QPen pen;
pen.setColor(Qt::red);
pen.setWidth(4);
QBrush brush(Qt::black);
p.setPen(pen);
p.setBrush(brush);
p.setRenderHint(QPainter::Antialiasing);
p.translate(width()/2, height()/2);
int r = width() > height() ? height()/2 - 5 : width()/2 - 5;
p.drawEllipse(QPoint(0, 0), r, r);
pen.setColor(Qt::yellow);
pen.setWidth(2);
p.setPen(pen);
for(int i = 0; i < 60; i++){
p.rotate(6);
p.drawLine(QPoint(r*19/20, 0), QPoint(r, 0));
}
pen.setColor(Qt::red);
pen.setWidth(4);
p.setPen(pen);
for(int i = 0; i < 12; i++){
p.rotate(30);
p.drawLine(QPoint(r*18/20, 0), QPoint(r, 0));
}
p.rotate(count * 6 / 60/12);
QPoint s1[4] = {
QPoint(0, -r/2),
QPoint(r/15, 0),
QPoint(0, r/4),
QPoint(-r/15, 0)
};
p.setBrush(QBrush(Qt::red));
pen.setWidth(2);
p.setPen(pen);
p.drawConvexPolygon(s1, 4);
p.rotate(-count * 6 / 60/12);
p.rotate(count * 6 / 60);
QPoint s2[4] = {
QPoint(0, -r*3/4),
QPoint(r/20, 0),
QPoint(0, r/4),
QPoint(-r/20, 0)
};
pen.setColor(Qt::blue);
pen.setWidth(2);
p.setPen(pen);
p.setBrush(QBrush(Qt::blue));
p.drawConvexPolygon(s2, 4);
p.rotate(-count * 6 / 60);
p.rotate(count * 6);
QPoint s3[4] = {
QPoint(0, -r*19/20),
QPoint(r/25, 0),
QPoint(0, r/4),
QPoint(-r/25, 0)
};
pen.setColor(Qt::green);
pen.setWidth(1);
p.setPen(pen);
p.setBrush(QBrush(Qt::green));
p.drawConvexPolygon(s3, 4);
if(count > 24 * 60 * 60)
count = -1;
count++;
}
void MyColock::timeOut()
{
update();
}
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include "mycolock.h"
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = 0);
~Widget();
private:
MyColock *colock;
};
#endif
widget.c
#include "widget.h"
#include <QHBoxLayout>
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
colock = new MyColock(this);
QHBoxLayout *hb = new QHBoxLayout;
hb->addWidget(colock);
setLayout(hb);
}
Widget::~Widget()
{
}
2.引入时钟控件设计一个时钟,按下开始开始计时间,按下停止就停止计时
mycolock.h
#ifndef MYCOLOCK_H
#define MYCOLOCK_H
#include <QWidget>
#include <QPainter>
#include <QPen>
#include <QBrush>
#include <QPaintEvent>
#include <QTimer>
class MyColock : public QWidget
{
Q_OBJECT
public:
explicit MyColock(QWidget *parent = nullptr);
void paintEvent(QPaintEvent *);
void startTime(int msec);
void stopTime();
signals:
void timeShow(QString);
public slots:
void setTime(int mse = 1000);
private slots:
void timeOut();
private:
QTimer *time;
double count = 0;
};
#endif
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QDebug>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
private slots:
void on_pushButton_clicked();
void on_pushButton_2_clicked();
void timeShow(QString time);
private:
Ui::Widget *ui;
};
#endif
mycolock.c
#include "mycolock.h"
MyColock::MyColock(QWidget *parent) : QWidget(parent)
{
time = new QTimer(this);
connect(time, &QTimer::timeout, this, &MyColock::timeOut);
}
void MyColock::paintEvent(QPaintEvent *)
{
QPainter p(this);
QPen pen;
pen.setColor(Qt::red);
pen.setWidth(4);
QBrush brush(Qt::black);
p.setPen(pen);
p.setBrush(brush);
p.setRenderHint(QPainter::Antialiasing);
p.translate(width()/2, height()/2);
int r = width() > height() ? height()/2 - 5 : width()/2 - 5;
p.drawEllipse(QPoint(0, 0), r, r);
pen.setColor(Qt::yellow);
pen.setWidth(2);
p.setPen(pen);
for(int i = 0; i < 60; i++){
p.rotate(6);
p.drawLine(QPoint(r*19/20, 0), QPoint(r, 0));
}
pen.setColor(Qt::red);
pen.setWidth(4);
p.setPen(pen);
for(int i = 0; i < 12; i++){
p.rotate(30);
p.drawLine(QPoint(r*18/20, 0), QPoint(r, 0));
}
p.rotate(count * 6 / 60/12);
QPoint s1[4] = {
QPoint(0, -r/2),
QPoint(r/15, 0),
QPoint(0, r/4),
QPoint(-r/15, 0)
};
p.setBrush(QBrush(Qt::red));
pen.setWidth(2);
p.setPen(pen);
p.drawConvexPolygon(s1, 4);
p.rotate(-count * 6 / 60/12);
p.rotate(count * 6 / 60);
QPoint s2[4] = {
QPoint(0, -r*3/4),
QPoint(r/20, 0),
QPoint(0, r/4),
QPoint(-r/20, 0)
};
pen.setColor(Qt::blue);
pen.setWidth(2);
p.setPen(pen);
p.setBrush(QBrush(Qt::blue));
p.drawConvexPolygon(s2, 4);
p.rotate(-count * 6 / 60);
p.rotate(count * 6);
QPoint s3[4] = {
QPoint(0, -r*19/20),
QPoint(r/25, 0),
QPoint(0, r/4),
QPoint(-r/25, 0)
};
pen.setColor(Qt::green);
pen.setWidth(1);
p.setPen(pen);
p.setBrush(QBrush(Qt::green));
p.drawConvexPolygon(s3, 4);
int s = (int)count % 60;
int m = (int)count / 60 % 60;
int h = (int)count / 60 / 60 % 24;
emit timeShow(QString("%1: %2: %3").arg(h, 2).arg(m, 2).arg(s, 2));
if(count > 24 * 60 * 60)
count = -1;
count++;
}
void MyColock::startTime(int msec)
{
time->start(msec);
}
void MyColock::stopTime()
{
time->stop();
}
void MyColock::setTime(int mse)
{
time->stop();
count = mse;
time->start();
}
void MyColock::timeOut()
{
update();
}
widget.c
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
connect(ui->horizontalSlider, &QSlider::valueChanged, ui->colock, &MyColock::setTime);
connect(ui->colock, &MyColock::timeShow, this, &Widget::timeShow);
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_pushButton_clicked()
{
ui->colock->startTime(10);
}
void Widget::on_pushButton_2_clicked()
{
ui->colock->stopTime();
}
void Widget::timeShow(QString time)
{
qDebug() << time;
}