1> 制作一个闹钟软件
widget.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_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic: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
widget.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无论多么艰难,都要相信自己!";// 设置文本对齐方式,居中显示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, "闹钟取消", "闹钟已取消");
}
main.cpp:
#include "widget.h"#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);Widget w;w.show();return a.exec();
}
3> 将网络聊天室服务器端,重新实现一遍
widget.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_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private slots:void on_startBtn_clicked();void newConnect_slot(); //自定义处理newConnect信号的槽函数void readyRead_slot(); //自定义处理readyRead信号的槽函数private:Ui::Widget *ui;QTcpServer *server; //定义服务器指针QVector<QTcpSocket*> client_vector; //客户端容器
};
#endif // WIDGET_H
widget.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);//将服务器的newConnection信号连接到自定义的槽函数中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 QHostAddress &address = QHostAddress::Any, quint16 port = 0);//参数1:要监听的ip地址,允许哪些主机连接到当前服务器,默认是Any,表示任意一个主机都可以连接该服务器//参数2:提供的端口号,默认值为0,表示其他主机可以通过任意一个 端口号连接到当前服务器,一般具体指定//返回值:成功启动返回真,否则返回假if(server->listen(QHostAddress::Any, port)){QMessageBox::information(this,"提示", "服务器打开成功");}else{QMessageBox::information(this,"提示", "服务器打开失败");return;}//此时,服务器已经打开成功,如果有客户端发来连接请求//那么该服务器就会自动发射一个newConnection的信号//我们可以将该信号连接到自定义的槽函数中执行相关逻辑//一般将该连接写在构造函数中
}//newConnect对应槽函数的实现
void Widget::newConnect_slot()
{qDebug()<<"有新的客户端连接成功";//获取最新连接的客户端套接字//函数原型:virtual QTcpSocket *nextPendingConnection();//参数:无//返回值:最新连接的客户端套接字地址QTcpSocket *s = server->nextPendingConnection();
// QString msg = "my name is zhangpp";
// s->write(msg.toLocal8Bit());//将客户端套接字放入到客户端容器中client_vector.push_back(s);//此时,就可以完成一个服务器对应多个客户端了//如果此时,当前客户端有消息发送到服务器中,那么该客户端就会自动发射一个readyRead信号//我们可以将该信号连接到自定义的槽函数中执行相关逻辑connect(s, &QTcpSocket::readyRead, this, &Widget::readyRead_slot);
}
//readyRead信号对应的槽函数
void Widget::readyRead_slot()
{//判断是哪个客户端发来消息for(int i=0; i<client_vector.size(); i++){//client_vector[i]:表示的是任意一个客户端//函数原型:qint64 bytesAvailable() const override;//功能:返回当前客户端中待读数据的字节数,如果字节数为0,表示没有数据可读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);}}}}
}