制作简易闹钟
头文件
#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,"提示","断开连接");
}
效果图