Qt 07封装一个控件类

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_H
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_H
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 // MYCOLOCK_H

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 // WIDGET_H

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值