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();
}
运行结果: