qt小练习

news2024/11/23 8:34:46

制作简易闹钟

头文件
#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
源文件
#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实现网络编程

服务器

头文件
#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
源代码
#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);
            }
        }
    }
}

客户端

头文件
#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
源代码
#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,"提示","断开连接");
}
效果图

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2203574.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C语言复习】常见概念(零基础)

【C语言复习】常见概念 1、C语言是什么&#xff1f;2、C语言的历史和辉煌3、 编译器的选择VS20223.1编译和链接3.2编译器的对比3.3 VS2022 的优缺点 4、VS项⽬ 和 源⽂件、头⽂件介绍5、第一个C语言程序6、main函数&#xff08;主函数&#xff09;7、printf和库函数8、关键字介…

基于springboot的大学生体质测试管理系统(含源码+sql+视频导入教程)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 基于springboot的大学生体质测试管理系统1拥有三种角色 管理员&#xff1a;学生管理、教师管理、日常运行管理、运动分析管理、成绩管理、论坛管理、轮播图管理等 教师&#xff1a;登录…

如何在RuoYi-Vue项目中去除`/dev-api`前缀

前言 在使用RuoYi-Vue框架进行Web应用开发时&#xff0c;有时会遇到API路径需要特定前缀的问题。例如&#xff0c;在某些情况下&#xff0c;开发者可能希望移除或更改默认的/dev-api前缀。 问题描述 当使用YApi直接请求后台接口时&#xff0c;无需添加/dev-api前缀。在生成和…

C++第十六节课 万字详细手动实现string类!

std::basic_string std::basic_string 是 C 标准库中定义的一个模板类&#xff0c;它用于表示字符串。C 中的 std::string 实际上是 std::basic_string<char> 的一个特化版本。也就是说&#xff0c;std::string 是 std::basic_string 这个模板类的一个具体实现&#xff0…

DAY29|| 93.复原ip地址 |78.子集 |90.子集Ⅱ

93.复原ip地址 题目&#xff1a;93. 复原 IP 地址 - 力扣&#xff08;LeetCode&#xff09; 有效 IP 地址 正好由四个整数&#xff08;每个整数位于 0 到 255 之间组成&#xff0c;且不能含有前导 0&#xff09;&#xff0c;整数之间用 . 分隔。 例如&#xff1a;"0.1.2.…

国外电商系统开发-运维系统上传脚本

创建脚本的方式有两种&#xff1a;第一种脚本文件&#xff0c;第二种在线写脚本。并且友好的支持中文的显示和脚本的中文名。 第一种是从您的PC电脑上传一个脚本文件&#xff0c;当然了&#xff0c;还是以老用法&#xff0c;直接拖动就行&#xff1a; 第二种上传方式&#xff0…

『网络游戏』服务器日志工具类优化【18】

创建脚本&#xff1a;PECommon.cs 编写脚本&#xff1a;PECommon.cs 修改脚本&#xff1a;LoginSys 替换 替换完成 修改客户端脚本&#xff1a;ResSvc.cs 本章结束

仓储物流行业--仓储服务升级经典案例

在当今内外贸竞争激烈的仓储物流行业&#xff0c;高效的数据处理和管理是企业提升竞争力的关键。杭州某供应链公司作为一家专注为中小卖家提供定制仓储服务方案的第三方云仓&#xff0c;在业务发展过程中面临着数据处理方面的诸多挑战。本文将详细介绍云仓项目如何通过轻易云数…

上海交通大学震撼发布:首个OpenAI O1项目复现报告,揭秘独家经验!

来源 | 机器之心 团队介绍&#xff1a;本项目的核心开发团队主要由上海交通大学 GAIR 研究组的本科三年级、四年级学生以及直博一年级研究生组成。项目得到了来自 NYU 等一线大型语言模型领域顶尖研究科学家的指导。 详细作者介绍见&#xff1a;https://github.com/GAIR-NLP/…

FireFox简单设置设置

文章目录 一 设置不显示标签页1原来的样子2新的样子3操作方法 二 设置竖直标签页栏1 效果图2 设置方法 三 设置firefox不提醒更新 一 设置不显示标签页 1原来的样子 2新的样子 3操作方法 地址栏输入 about:config搜索icon,双击选项列表中browserchrome.site icons的值&#…

HWS赛题 入门 MIPS Pwn-Mplogin(MIPS_shellcode)

解题所涉知识点&#xff1a; 泄露或修改内存数据&#xff1a; 堆地址&#xff1a;栈地址&#xff1a;栈上数据的连带输出(Stack Leak) && Stack溢出覆盖内存libc地址&#xff1a;BSS段地址&#xff1a; 劫持程序执行流程&#xff1a;[[MIPS_ROP]] 获得shell或flag&am…

关于css文字下划线动画实现

直接上代码 html部分 <div><span class"txt">文字下滑动画</span></div>css部分 .txt {background: linear-gradient(270deg, #4f95fd 0%, #1059df 100%) no-repeat left bottom;background-size: 0px 2px;background-position-x: right;tr…

汽车微控制器 (MCU)市场报告:未来几年年复合增长率CAGR为5.8%

汽车微控制器是一种高度集成的电路芯片&#xff0c;集成了中央处理器&#xff08;CPU&#xff09;、存储器&#xff08;ROM、RAM、EEPROM等&#xff09;和各种输入输出接口&#xff08;I/O&#xff09;&#xff0c;能够通过软件编程实现对汽车各种电子设备的控制和管理。在汽车…

字符设备驱动模块 dev和misc

字符设备驱动模块 用户空间和内核空间数据拷贝&#xff1a; copy_from_user(); 用户空间数据传给内核 copy_to_user(); 内核数据传给用户空间 动态和静态分别编译 设置Kconfig属性 编译内核文件&#xff08;静态、动态内核文件&#xff09; 启动动态驱动模块 查看动态驱动…

深度学习每周学习总结J2(ResNet-50v2算法实战与解析 - 鸟类识别)

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 目录 0. 总结1. 设置GPU2. 导入数据及处理部分3. 划分数据集4. 模型构建部分5. 设置超参数&#xff1a;定义损失函数&#xff0c;学习率&a…

Web开发:总结常见的批处理脚本(.bat)

一、一键复制多个文件 echo off setlocalset source01.pngcopy "%source%" "a.png" copy "%source%" "b.png" copy "%source%" "c.png"endlocal说明&#xff1a; 将上述代码复制到一个新的文本文件中。将文件保…

4.STM32-中断

STM32-中断 需求&#xff1a;红灯每两秒进行闪烁&#xff0c;按键key1控制绿灯亮灭 简单的程序代码无法满足要求 如何让STM32既能执行HAL_DELAY这种耗时的任务&#xff0c;同时又能快速响应按键按下这种突发情况呢 设置中断步骤 1.接入中断 将KEY1输入模式由原先的GPIO_In…

React学习02 -事件处理、生命周期和diffing算法

文章目录 react事件处理非受控组件受控组件高阶函数函数柯里化 生命周期引出生命周期旧版生命周期新版生命周期 Diffing算法 react事件处理 1.react通过onXXX属性指定事件处理函数&#xff0c; a.react使用的是自定义事件&#xff0c;将原生js事件方法重写并改为小驼峰写法&am…

大数据新视界 --大数据大厂之大数据驱动下的物流供应链优化:实时追踪与智能调配

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

前端自定义指令控制权限(后端Spring Security)

1. 新建 directives/auth.ts &#xfeff; &#xfeff; //导入自定义指令 import auth from /directives/auth// 注册全局自定义指令 v-auth app.directive(auth, auth);&#xfeff;1.1完整的authDirective.ts import { wmsStore } from "/store/pinia"// 判断用…