QT设计一个小闹钟

        设置一个闹钟,左侧窗口显示当前时间,右侧设置时间,以及控制闹钟的开关,下方显示闹钟响时的提示语。当按启动按钮时,设置时间与闹钟提示语均不可再改变。当点击停止时,关闭闹钟并重新启用设置时间与闹钟提示语。

闹钟窗口展示:

工程管理文件:

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

FORMS += \
    widget.ui

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

RESOURCES += \
    picture.qrc

头文件:

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QDebug>
#include <QLabel>   //标签
#include <QTextEdit>    //文本编辑器
#include <QLineEdit>    //行编辑器
#include <QPushButton>  //按钮

#include <QTimerEvent>  //事件处理函数
#include <QDateTime>
#include <QtTextToSpeech>    //播报员
#include <QPaintEvent>
#include <QPainter>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public slots:
    //定义启动按钮的槽函数
    void on_btnStart_clicked();
    //定义停止按钮的槽函数
    void on_btnStop_clicked();

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

    //重写定时器事件处理函数
    void timerEvent(QTimerEvent *event) override;
    void paintEvent(QPaintEvent *event) override;

    void mouseMoveEvent(QMouseEvent *event) override;
    void mousePressEvent(QMouseEvent *event) override;

private:
    Ui::Widget *ui;

    QLabel *lab_time;
    QPushButton *btn_start;
    QPushButton *btn_stop;
    QLineEdit *line_setTime;
    QTextEdit *text_show;

    int time_id;    //基于事件处理函数
    QString oclock;   //设置闹钟
    QTextToSpeech *speak;   //设置播报员

    QPoint drap;
};
#endif // WIDGET_H

主函数:

#include "widget.h"

#include <QApplication>

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

主要功能函数:

#include "widget.h"
#include "ui_widget.h"


Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    //实例化一个播报员
    speak = new QTextToSpeech(this);
    time_id = this->startTimer(1000);

    //纯净窗口
    this->setWindowFlag(Qt::FramelessWindowHint);
    //固定窗口尺寸
    this->setFixedSize(540,410);

    //显示当前时间
    lab_time = new QLabel(this);
    lab_time->setAlignment(Qt::AlignCenter);
    lab_time->setStyleSheet("border:2px solid rgb(0, 170, 255);font:16pt;border-radius:10px;color:white");
    lab_time->setGeometry(20,20,300,120);

    //设置text窗口
    text_show = new QTextEdit(this);
    text_show->setPlaceholderText("请输入闹钟提示语");
    text_show->setAlignment(Qt::AlignCenter);
    text_show->setStyleSheet("border:2px solid rgb(0, 170, 255);border-radius:5px;font:20pt;background-color:transparent;color:white");
    text_show->setGeometry(20,150,500,250);

    //显示设置的时间
    line_setTime = new QLineEdit(this);
    line_setTime->setPlaceholderText("请设置时间");
    line_setTime->setAlignment(Qt::AlignCenter);
    line_setTime->setStyleSheet("border:2px solid rgb(0, 170, 255);font:16pt;border-radius:10px;background-color:transparent;color:white");
    line_setTime->setGeometry(350,20,170,60);


    //启动按钮
    btn_start = new QPushButton(this);
    btn_start->setText("启动");
    btn_start->setStyleSheet("border:2px solid rgb(0, 170, 255);border-radius:10px;font:14pt;color:white");
    btn_start->setGeometry(350,90,80,50);

    //停止按钮
    btn_stop = new QPushButton(this);
    btn_stop->setText("停止");
    btn_stop->setStyleSheet("border:2px solid rgb(0, 170, 255);border-radius:10px;font:14pt;color:white");
    btn_stop->setGeometry(440,90,80,50);



    //启动按钮
    connect(btn_start, &QPushButton::clicked, this, &Widget::on_btnStart_clicked);
    connect(btn_stop, &QPushButton::clicked, this, &Widget::on_btnStop_clicked);

}

Widget::~Widget()
{
    delete ui;
}

void Widget::on_btnStart_clicked()
{
    oclock = line_setTime->text();
    line_setTime->setEnabled(false);
    text_show->setEnabled(false);
    btn_start->setText("已启动");
}

void Widget::on_btnStop_clicked()
{
    line_setTime->setEnabled(true);
    text_show->setEnabled(true);
    speak->stop();
    btn_start->setText("启动");
}
void Widget::timerEvent(QTimerEvent *event)
{
    if(event->timerId() == time_id)
    {
        QDateTime time = QDateTime::currentDateTime();
        lab_time->setText(time.toString("yyyy-MM-dd hh:mm:ss"));
        if(oclock == time.toString("hh:mm:ss"))
        {
            speak->say(text_show->toPlainText());
        }
    }
}

void Widget::paintEvent(QPaintEvent * event)
{
    QPainter painter(this);
    painter.drawPixmap(rect(),QPixmap(":/picture/back.jpg"),QRect());
}



void Widget::mousePressEvent(QMouseEvent *event)
{
    drap = event->globalPos() - this->pos();

    //右键关闭窗口
    if(event->button() == Qt::RightButton)
    {
        this->close();
    }
}

void Widget::mouseMoveEvent(QMouseEvent *event)
{
    this->move(event->globalPos() - drap);
}

猜你喜欢

转载自blog.csdn.net/weixin_53478812/article/details/132656378
今日推荐