QT(9.3)定时器,绘制事件

作业:

自定义一个闹钟

pro文件:

QT       += core gui texttospeech

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

CONFIG += c++11

# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

SOURCES += 
    main.cpp 
    widget.cpp

HEADERS += 
    widget.h

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

头文件:

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QPushButton>//按钮类
#include <QLineEdit>//行编辑器
#include <QTextEdit>//文本编辑器
#include <QLabel>//标签
#include <QPainter>//画家类
#include <QPaintEvent>//绘制事件
#include <QTime> //时间类
#include <QTimer>//定时器类
#include <QTimerEvent>//定时器事件类
#include <QDateTime>//日期时间类
#include <QTextToSpeech>//文本转语音
#include<QMouseEvent>//鼠标移动事件

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
    QLabel *lab1; //实例化一个标签对象
    QLineEdit *edit1;//是实例化一个行编辑器对象
    QPushButton *btn_start,*btn_stop;//实例化开始按钮和停止按钮
    QTextEdit *txtedit;//实例化一个文本编辑器对象
public:
    void btn_start_slot();//自定义开始按钮的槽函数
    void btn_stop_slot();//自定义停止按钮的槽函数
    void paintEvent(QPaintEvent *event) override;//重写绘画事件处理函数
    void timeout_slot();//自定义处理timeout信号的函数
    void mousePressEvent(QMouseEvent *event) override;//鼠标按下事件
    void mouseMoveEvent(QMouseEvent *event) override;//鼠标移动事件
    QString tm;//定义时间字符串
private:
    QTimer *timer;//定义定时器
    QTextToSpeech *speecher;//定义语音播报
    QPoint drap;  //定义z向量

};
#endif // WIDGET_H

自定义函数:
 

#include "widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    //设置纯净窗口
    this->setWindowFlag(Qt::FramelessWindowHint);
    //设置窗口大小为一个固定大小
    this -> setFixedSize(700,375);
    //设置窗口透明度
    this -> setWindowOpacity(1);
    //设置边框粗细
    this->setStyleSheet("background-color:skyblue;border:10px solid rgb(0,0,0);border-radius:10px");
    // 创建一个标签,显示时间
    lab1 = new QLabel(this);
    //设置标签大小
    lab1->resize(425,100);
    //设置位置
    lab1->move(25,25);
    //创建一个行编辑器
    edit1 = new QLineEdit(this);
    //设置行编辑器大小
    edit1->resize(200,55);
    //设置行编辑器中字体大小
    edit1->setFont(QFont("微软雅黑",15));
    //设置行编辑器位置
    edit1->move(lab1->x()+450,lab1->y());
    //设置占位文本
    edit1->setPlaceholderText("输入时间00:00:00");
    //创建一个开始按钮
    btn_start = new QPushButton("启动",this);
    //设置按钮大小
    btn_start->resize(90,40);
    //设置按钮位置
    btn_start->move(edit1->x(),edit1->y()+60);
    //创建一个停止按钮
    btn_stop = new QPushButton("停止",this);
    //设置停止按钮为不可用状态
    btn_stop->setEnabled(false);
    //设置按钮大小
    btn_stop->resize(90,40);
    //设置按钮位置
    btn_stop->move(btn_start->x()+110,btn_start->y());
    // 创建一个文本编辑器
    txtedit = new QTextEdit(this);
    //设置文本编辑器大小
    txtedit->resize(650,200);
    //设置文本编辑器的位置
    txtedit->move(lab1->x(),lab1->y()+125);
    //设置文本编辑器内容居中
    txtedit->setAlignment(Qt::AlignCenter);
    //设置文本编辑器文字
    txtedit->setFont(QFont("微软雅黑",20));
    //设置文本编辑器占位符
    txtedit->setPlaceholderText("提示:鼠标左键按住拖动移动,鼠标右键按下窗口关闭。不输入播报默认起床");
    //实例化一个定时器
    timer = new QTimer(this);
    //将该定时器的timeout信号连接到自定义槽函数
    connect(timer,&QTimer::timeout,this,&Widget::timeout_slot);
    //启动定时器
    timer->start(1000);//定时器一秒发送一个信号
    //连接开始按钮和对应槽函数
    connect(this->btn_start,&QPushButton::clicked,this,&Widget::btn_start_slot);
    //连接停止按钮和对应的槽函数
    connect(this->btn_stop,&QPushButton::clicked,this,&Widget::btn_stop_slot);
    //实例化播报员
    speecher = new QTextToSpeech(this);

}
//绘制事件
void Widget::paintEvent(QPaintEvent *event)
{
    //绘制窗口边框
    QPen pen;
    pen.setWidth(15);//设置画笔颜色
    QPainter maliang(this);
    pen.setColor("purple");//设置画笔颜色
    pen.setStyle(Qt::DashLine);//设置画笔的线的形状
    maliang.setPen(pen);
    maliang.drawRect(0,0,this->width(),this->height());//绘制边框
}
//处理信号对应的槽函数
void Widget::timeout_slot()
{
    //调用QTime的静态成员函数获取当前系统时间
    QDateTime sys_time = QDateTime::currentDateTime();
    //将事件展示到label1中
    this->lab1->setText(sys_time.toString("yyyy-MM-dd hh:mm:ss"));
    this->lab1->setAlignment(Qt::AlignCenter);
    this->lab1->setFont(QFont("微软雅黑",25));
    if(sys_time.toString("hh:mm:ss")==tm)
    {
        if(txtedit->toPlainText()==NULL)
        {
                speecher->say("起床起床起床起床起床起床起床起床");
        }
            speecher->say(txtedit->toPlainText());
    }

}
//开始按钮信号对应槽函数
void Widget::btn_start_slot()
{
    this->btn_start->setEnabled(false);//设置开始按钮不可用
    this->edit1->setEnabled(false);//设置输入时间编辑器不可用
    this->txtedit->setEnabled(false);//设置输入提示文本编辑器不可用
    this->btn_stop->setEnabled(true);//设置停止按钮可用
    tm = this->edit1->text();

}

//停止按钮信号对应的槽函数
void Widget::btn_stop_slot()
{
    this->btn_start->setEnabled(true);//设置开始按钮可用
    this->btn_stop->setEnabled(false);//设置结束按钮不可用
    this->edit1->setEnabled(true);//设置输入时间编辑器可用
    this->txtedit->setEnabled(true);//设置输入提示文本编辑器可用
    speecher->stop();
}
void Widget::mousePressEvent(QMouseEvent *event)//鼠标按下事件
{
    if(event->button()==Qt::RightButton)
    {
        this->close();
    }
    drap = event->globalPos() - this->pos(); //相对于整个屏幕,组件左上角到组件中鼠标的向量
}
void Widget::mouseMoveEvent(QMouseEvent *event) //鼠标移动事件
{
    this->move(event->globalPos()-drap);  //将组件移动到新位置,由鼠标所在向量减去组件左上角到鼠标向量
}
Widget::~Widget()
{
}

主函数:

#include "widget.h"

#include <QApplication>

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

运行结果: