当前位置: 首页 > article >正文

2025.2.11

1> 制作一个闹钟软件

.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QLabel>
#include <QLineEdit>
#include <QPushButton>
#include <QTime>
#include <QTimer>
#include <QTimeEdit>
#include <QDateEdit>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

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

private:
    Ui::Widget *ui;
    QPushButton *btn1;
    QPushButton *btn2;
    QLabel *lab;
    QLineEdit *edit;
    QTimer *timer;
    QTimeEdit *timeedit;
    QTime alarmTime;
    bool alarmSet;
private slots:
    void update_slot();
    void setAlarm_slot();
    void cancel_slot();
};
#endif // WIDGET_H

.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QWidget>
#include <QLabel>
#include <QLineEdit>
#include <QPushButton>
#include <QTime>
#include <QTimer>
#include <string>
#include <QMessageBox>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    setFixedSize(800,400);

    //创建垂直布局

    //获取标签
    QLabel *lab = new QLabel(this);
    lab->setGeometry(80,50,200,50);
    lab->setStyleSheet(
        "border: 2px solid black;"      // 黑色边框,宽度为2px
        "border-radius: 5px;"           // 边框圆角,值越大圆角越明显
        "background-color: lightgray;"  // 背景颜色
        "font: 16px Arial;"             // 字体和大小
    );
    QLabel *lab1 = new QLabel(this);
    lab1->setGeometry(30,180,740,220);
    lab1->setStyleSheet(
        "border: 2px solid black;"      // 黑色边框,宽度为2px
        "border-radius: 5px;"           // 边框圆角,值越大圆角越明显
        "background-color: lightgray;"  // 背景颜色
        "font: 16px Arial;"             // 字体和大小
    );
    // 设置标签的文本内容
    QString motivationalText = "三更灯火五更鸡,\n正是男儿读书时,\n黑发不知勤学早,\n白手方悔读书迟。";

    // 设置文本对齐方式,居中显示
    lab1->setText(motivationalText);
    lab1->setAlignment(Qt::AlignCenter);  // 设置文本居中

    //创建时间选择器
    timeedit = new QTimeEdit(this);
    timeedit->setGeometry(450,50,250,50);
    timeedit->setDisplayFormat("HH:mm:ss");
    timeedit->setTime(QTime::currentTime());

    //设置按钮
    btn1 = new QPushButton(this);//启动
    btn2 = new QPushButton(this);//取消
    btn1->setGeometry(450,110,65,30);
    btn2->setGeometry(600,110,65,30);
    btn1->setText("启动");
    btn2->setText("取消");

    //获取系统当前的时间
    QTime sysTime = QTime::currentTime();
    //将时间转化为字符串
    QString t = sysTime.toString("hh:mm:ss");
    lab->setText(t);

    //创建定时器
    timer = new QTimer(this);
    connect(timer,&QTimer::timeout,this,&Widget::update_slot);
    //启动定时器
    timer->start(1000);

    //连接按钮点击事件
    connect(btn1,&QPushButton::clicked,this,&Widget::setAlarm_slot);
    connect(btn2,&QPushButton::clicked,this,&Widget::cancel_slot);

    //初始化闹钟
    alarmSet = false;

}


void Widget::update_slot()
{

    //每秒获取当前时间并更新
    //获取系统当前的时间
    QTime sysTime = QTime::currentTime();
    //将时间转化为字符串
    QString t = sysTime.toString("hh:mm:ss");
    // 获取父类窗口中的lab标签,并更新文本
       QLabel *lab = findChild<QLabel *>();
       if (lab)
       {
           lab->setText(t);
       }
      //判断闹钟
       if(alarmSet && sysTime >= alarmTime )
       {
           QMessageBox::information(this,"闹钟","时间到");
           alarmSet = false;
       }
}

Widget::~Widget()
{
    delete ui;
}
//设置
void Widget::setAlarm_slot()
{
    //获取设置的闹钟时间
    alarmTime = timeedit->time();
    //启动闹钟
    if(!alarmSet)
    {
        alarmSet = true;
        QMessageBox::information(this, "闹钟", "闹钟已启动");

    }else
    {
        QMessageBox::information(this, "闹钟", "无法重复设置");
    }
}
//取消
void Widget::cancel_slot()
{
    //timer->stop();
        alarmSet = false;
        QMessageBox::information(this, "闹钟取消", "闹钟已取消");
}

3> 将网络聊天室服务器端,重新实现一遍

.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QTcpServer>          //服务器类
#include <QTcpSocket>          //客户端类
#include <QVector>             //动态数组类
#include <QMessageBox>
#include <QDebug>

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_startbtn_clicked();
    void newConnect_slot();
    void readyRead_slot();
private:
    Ui::Widget *ui;
    QTcpServer *server;
    QVector<QTcpSocket*> client_vector;
};
#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);
    //将服务器的newConnect信号连接到自定义的槽函数中
    connect(server,&QTcpServer::newConnection,this,&Widget::newConnect_slot);
}

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

void Widget::on_startbtn_clicked()
{
    quint16 port = ui->portedit->text().toUInt();
    //启动服务器
    //函数原型:bool listen(const)
    if(server->listen(QHostAddress::Any,port))
    {
        QMessageBox::information(this,"提示","服务器打开成功");
    }else
    {
        QMessageBox::information(this,"提示","服务器打开失败");
        return;
    }
}
//newConnect对应槽函数的实现
void Widget::newConnect_slot()
{
    qDebug()<<"有新的客户端连接成功";

    //获取最新连接的客户端套接字
    QTcpSocket *s = server->nextPendingConnection();
    //QString msg = "我是zpp";
    //s->write(msg.toLocal8Bit());
    //将客户端套接字放入到客户端容器中
    client_vector.push_back(s);

    //此时就可以完成一个服务器对应多个客户端
    //如果此时,当前客户端有消息发送到服务器中,那么该客户端会自动发送一个readyread信号
    //我们可以将该信号连接到自定义的槽函数中执行相关逻辑
    connect(s,&QTcpSocket::thread,this,&Widget::readyRead_slot);
}

//readyRead信号对应的槽函数
void Widget::readyRead_slot()
{
    //判断是哪个客户端发来消息
    for(int i=0;i<client_vector.size();i++)
    {
        //client_vector[i],表示的是任意一个客户端
        if(client_vector[i]->bytesAvailable()!=0)
        {
            //表示当前客户端有消息可读取
            QByteArray msg = client_vector[i]->readAll();

            //将QByteArray类型转换为QString类型
            QString msg_string = QString::fromLocal8Bit(msg);

            //将消息展示在ui界面上
            ui->msgwidget->addItem(msg_string);

            //将消息转发给所有客户端,无需转发自己
            for(int j=0;j<client_vector.size();j++)
            {
                if(i!=j)
                {
                    client_vector[j]->write(msg);
                }
            }

        }
    }
}

4> 思维导图


http://www.kler.cn/a/542055.html

相关文章:

  • Java进阶篇之多线程
  • Qt Pro、Pri、Prf
  • 【JVM详解二】常量池
  • Left side cannot be assigned to
  • DeepSeek从入门到精通:全面掌握AI大模型的核心能力
  • UML学习
  • CSS 性能优化全攻略:提升网站加载速度与流畅度
  • 安装WPS后,导致python调用Excel.Application异常,解决办法
  • 深度学习之神经网络框架搭建及模型优化
  • 17.垃圾回收器
  • Android副屏锁屏界面-Android14
  • React - 事件绑定this
  • SearchBar组件的功能与用法
  • Kafka知识点总结
  • Python+网络爬虫+Hadoop的电影票房数据分析管理系统
  • 探索B-树系列
  • Docker 和 Kubernetes 如何协同工作?
  • VBA语言的数据可视化
  • 【愚公系列】《Python网络爬虫从入门到精通》001-初识网络爬虫
  • Windows11+PyCharm利用MMSegmentation训练自己的数据集保姆级教程
  • 使用 Visual Studio Code (VS Code) 开发 Python 图形界面程序
  • Day59_20250207_图论part4_110.字符串接龙|105.有向图的完全可达性|106.岛屿的周长
  • Spring Boot整合DeepSeek实现AI对话(API调用和本地部署)
  • 淘宝App交易链路终端混合场景体验探索
  • 教育局网络设备运维和资产管理方案
  • SpringBoot中能被外部注入以来的注解