qt小练习

制作简易闹钟

头文件
cpp 复制代码
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QTimer>       //定时器类
#include <QDebug>        //信息调试类
#include <QMessageBox> //消息对话框类
#include <QTime>        //时间类
#include <QString>
#include <QTimerEvent>
#include <QDateTime>      //日期时间类,包含年月日
#include <QTextToSpeech>    // 文本转语音类

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

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

private slots:
    void on_startButton_clicked();   //开启闹钟按钮的槽函数的声明


    void on_cancleButton_clicked();       //取消闹钟按钮的槽函数的声明

private:
    Ui::Widget *ui;

    int timerId;    //定时器id
    int clockTimerId;     //闹钟定时器id
    //声明定时器处理函数
    void timerEvent(QTimerEvent *event)override;

    QTextToSpeech *speecher; //播报员指针

};
#endif // WIDGET_H
源文件
cpp 复制代码
#include "widget.h"
#include "ui_widget.h"

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

    //启动定时器
    timerId = this->startTimer(1000);

    //给播报员实例化对象
    speecher = new QTextToSpeech(this);
}

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

//设置闹钟按钮的槽函数
void Widget::on_startButton_clicked()
{
    //启动定时器
    clockTimerId = this->startTimer(1000);
    //按钮为不可用状态
    ui->startButton->setEnabled(false);
}
//定时器事件处理的函数
void Widget::timerEvent(QTimerEvent *event)
{
    //判断定时器是否到位
    if(event->timerId() == timerId)
    {
        //设置文本居中
        ui->label_2->setAlignment(Qt::AlignCenter);
        QDateTime sys_dateTime = QDateTime::currentDateTime();

        //调用toString函数转换
        QString d = sys_dateTime.toString("yyyy-MM-dd hh:mm:ss");
        //设置字体
        QFont font("Times New Roman",20,QFont::Bold);
        ui->label_2->setFont(font);
        ui->label_2->setText(d);
    }
    //判断闹钟是否到位
    if(event->timerId() == clockTimerId)
    {
        QTime sysTime = QTime::currentTime();     //获取当前时间
        QString t = sysTime.toString("hh:mm:ss");
        if(ui->alarmEdit->text() == t)         //系统时间和闹钟标签时间是否一致
        {

            //时间到,语言播报
            speecher->say(ui->textEdit->toPlainText());
            //关闭闹钟
            this->killTimer(clockTimerId);
            //设置按钮可用
            ui->startButton->setEnabled(true);
            //清除闹铃
            ui->alarmEdit->clear();
        }
    }
}
//关闭闹钟按钮对应的槽函数
void Widget::on_cancleButton_clicked()
{
    //关闭闹钟
    this->killTimer(clockTimerId);
    //设置按钮可用
    ui->startButton->setEnabled(true);
    //清除闹铃
    ui->alarmEdit->clear();
}
效果图

QT实现网络编程

服务器

头文件
cpp 复制代码
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QTcpServer>       //服务器类
#include <QTcpSocket>        //客户端类
#include <QDebug>            //信息调试类
#include <QMessageBox>       //信息对话框类
#include <QList>             //链表容器,存储连接的客户端

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

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

private slots:
    void on_startButton_clicked();
    void newConnection_plot();
    void readyRead_slot();
private:
    Ui::Widget *ui;

    //创建服务器指针
    QTcpServer *server;
    //客户端类
    QList<QTcpSocket*> clientList;

};
#endif // WIDGET_H
源代码
cpp 复制代码
#include "widget.h"
#include "ui_widget.h"

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

    //实例化服务器对象
    server = new QTcpServer(this);

    //链接新客户端的信号连接到自定义的槽信号
    connect(server,&QTcpServer::newConnection,this,&Widget::newConnection_plot);
}

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


void Widget::on_startButton_clicked()
{
    if(ui->startButton->text() == "开启服务器")
    {
        //获取文本的端口号
        quint16 port = ui->portEdit->text().toUInt();
        //开启服务器
        if(!server->listen(QHostAddress::Any,port))
        {
            QMessageBox::information(this,"提示","开启失败");
            return;
        }
        else
        {
            QMessageBox::information(this,"提示","成功开启");
        }
        //到这链接成功,服务器发送一个newConnection信号,只需要一次连接

        //将文本设置成关闭
        ui->startButton->setText("关闭服务器");
    }else
    {
        //关闭服务器
        server->close();
        //将文本设置成开启
        ui->startButton->setText("开启服务器");
    }
}

//处理newConnection信号的槽函数
void Widget::newConnection_plot()
{
    qDebug() << "有新客户端连接";

    //获取新连接的客户端的套接字
    QTcpSocket* s = server->nextPendingConnection();
    //将套接字存入链表
    clientList.push_back(s);

    //到此服务器可以获取客户端的套接字了
    //服务器收到客户端信息会发送readyRead信号
    connect(s,&QTcpSocket::readyRead,this,&Widget::readyRead_slot);
}

//处理readyRead信号的槽函数
void Widget::readyRead_slot()
{
    //遍历查看哪个客户端发的信息
    for(auto val:clientList)
    {
        if(val->bytesAvailable())    //判断客户端是否有信息待读
        {
            QByteArray msg = val->readAll();  //读取信息
            //展示到ui界面
            ui->listWidget->addItem(QString::fromLocal8Bit(msg));
            //转发所有客户端
            for(auto key:clientList)
            {
                key->write(msg);
            }
        }
    }
}

客户端

头文件
cpp 复制代码
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QTcpSocket>     //客户端类
#include <QMessageBox>    //信息对话框类

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

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

private slots:
    void on_connectButton_clicked();
    void connected_slot();
    void readyRead_slot();

    void on_sendButton_clicked();

    void on_disconnectButton_clicked();
    void disconnected_slot();

private:
    Ui::Widget *ui;

    QTcpSocket * client; //客户端指针

    QString userName;   //存储用户名

};
#endif // WIDGET_H
源代码
cpp 复制代码
#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    //实例化会客户端对象
    client = new QTcpSocket(this);

    //connected信号连接的槽函数
    connect(client,&QTcpSocket::connected,this,&Widget::connected_slot);
    //客户端收到信息,自动发送readyRead信号
    connect(client,&QTcpSocket::readyRead,this,&Widget::readyRead_slot);
    //处理断开信号
    connect(client,&QTcpSocket::disconnected,this,&Widget::disconnected_slot);

}

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

//连接按钮对应的槽函数
void Widget::on_connectButton_clicked()
{
    //获取文本框的内容
    userName = ui->nameEdit->text();
    QString ip = ui->idEdit->text();
    quint16 port = ui->portEdit->text().toUInt();
    //连接服务器
    client->connectToHost(ip,port);
    //连接成功发送connected信号

    //链接后设置按钮,文本框不可用
    ui->connectButton->setEnabled(false);
    ui->nameEdit->setEnabled(false);
    ui->idEdit->setEnabled(false);
    ui->portEdit->setEnabled(false);
}

//连接connected信号的槽函数
void Widget::connected_slot()
{
    QMessageBox::information(this,"提示","连接成功");
    QString msg = userName + "加入聊天";//准备进入的信息
    client->write(msg.toLocal8Bit());//发送信息
}

//readyRead信号的槽函数
void Widget::readyRead_slot()
{
    //接收套接字的内容
    QByteArray msg = client->readAll();
    //将其展示到ui界面
    ui->listWidget->addItem(QString::fromLocal8Bit(msg));
}

//发送按钮对应的槽函数
void Widget::on_sendButton_clicked()
{
    //获取文本内容
    QString msg = userName + ":" + ui->msgEdit->text();
    //发送给服务器
    client->write(msg.toLocal8Bit());
    //清空文本框
    ui->msgEdit->clear();
}

void Widget::on_disconnectButton_clicked()
{
    //将断开信息发送给服务器
    QString msg = userName + "退出聊天";//准备进入的信息
    client->write(msg.toLocal8Bit());//发送信息
    //断开服务器
    client->disconnectFromHost();
    //断开后自动发送disconnected信号
    //断开链接后设置按钮,文本框可用
    ui->connectButton->setEnabled(true);
    ui->nameEdit->setEnabled(true);
    ui->idEdit->setEnabled(true);
    ui->portEdit->setEnabled(true);
}

void Widget::disconnected_slot()
{
    QMessageBox::information(this,"提示","断开连接");
}
效果图
相关推荐
尹蓝锐1 分钟前
C语言-常见文件操作函数详解(fgetc,fputc,fgets,fputs,fscanf,fprintf,fread,fwrite)
c语言·开发语言
千里码aicood12 分钟前
[含文档+PPT+源码等]精品基于Python实现的Django高校职业通的设计与实现
开发语言·python·django
小林熬夜学编程30 分钟前
【Linux系统编程】第三十弹---软硬链接与动静态库的深入探索
服务器·c语言·开发语言·前端·c++·算法
ac-er888830 分钟前
PHP静态化和伪静态如何实现的
开发语言·php
tekin39 分钟前
php获取远程https内容时提示 PHP Warning: copy(): Unable to find the wrapper “https“ 解决方法
开发语言·macos·https·php
机器视觉知识推荐、就业指导1 小时前
双向数据库迁移工具:轻松实现 MySQL 与 SQLite 数据互导
数据库·c++·qt·mysql·sqlite
guangcheng0312q1 小时前
C++与Rust那些事之跳过析构函数
开发语言·c++·后端·rust
VaporGas1 小时前
SpringMVC Controller返回值技巧:ModelAndView vs String的实战对比
java·开发语言·前端·spring·springmvc·modelandview
java-小闭-全栈2 小时前
Java多线程面试题
java·开发语言