作业:
自定义一个闹钟
pro文件:
QT += core gui texttospeechgreaterThan(QT_MAJOR_VERSION, 4): QT += widgetsCONFIG += 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.0SOURCES += \main.cpp \widget.cppHEADERS += \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_OBJECTpublic: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();
}
运行结果: