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> 思维导图