已解决
Qt(day4)
来自网友在路上 161861提问 提问时间:2023-09-21 05:16:28阅读次数: 61
最佳答案 问答题库618位专家为你答疑解惑
思维导图
QT连接TCP网络通信
服务器
ser.h
#ifndef SER_H
#define SER_H#include <QWidget>
#include<QTcpServer> //服务器头文件
#include<QTcpSocket> //客户端头文件
#include<QMessageBox> //消息对话框
#include<QList> //链表头文件QT_BEGIN_NAMESPACE
namespace Ui { class Ser; }
QT_END_NAMESPACEclass Ser : public QWidget
{Q_OBJECTpublic:Ser(QWidget *parent = nullptr);~Ser();private slots:void on_connectbtn_clicked();void newConnection_slot(); //处理newConnection信号的槽函数void readyRead_slot(); //处理readyRead信号的槽函数private:Ui::Ser *ui;QTcpServer *server; //定义服务器指针QList<QTcpSocket *> clientList; //定义客户端容器
};
#endif // SER_H
ser.cpp
#include "ser.h"
#include "ui_ser.h"Ser::Ser(QWidget *parent): QWidget(parent), ui(new Ui::Ser)
{ui->setupUi(this);server=new QTcpServer(this); //实例化一个服务器connect(server,&QTcpServer::newConnection,this,&Ser::newConnection_slot);
}Ser::~Ser()
{delete ui;
}//启动服务器按钮对应的槽函数
void Ser::on_connectbtn_clicked()
{quint16 port=ui->portbtn->text().toUInt();if(server->listen(QHostAddress::Any,port)){QMessageBox::information(this,"成功","服务器启动成功");}else{QMessageBox::information(this,"失败","服务器启动失败");return;}
}
//处理newConnection信号的槽函数
void Ser::newConnection_slot(){QTcpSocket *s=server->nextPendingConnection(); //获取最新连接的客户端套接字clientList.push_back(s); //将套接字放入客户端链表中connect(s,&QTcpSocket::readyRead,this,&Ser::readyRead_slot);
}
//处理readyRead信号的槽函数
void Ser::readyRead_slot(){for(int i=0;i<clientList.count();i++){if(clientList[i]->state()==0){clientList.removeAt(i);}}for(int i=0;i<clientList.count();i++){if(clientList[i]->bytesAvailable()!=0){QByteArray msg=clientList[i]->readAll();ui->msgwidget->addItem(QString::fromLocal8Bit(msg));for(int j=0;j<clientList.count();j++){clientList[j]->write(msg);}}}
}
客户端
cli.h
#ifndef CLI_H
#define CLI_H#include <QWidget>
#include<QTcpSocket>
#include<QMessageBox>QT_BEGIN_NAMESPACE
namespace Ui { class cli; }
QT_END_NAMESPACEclass cli : public QWidget
{Q_OBJECTpublic:cli(QWidget *parent = nullptr);~cli();private slots:void on_connectbtn_clicked();void on_sendbtn_clicked();void on_disconnectbtn_clicked();void connected_slot();void readyRead_slot();void disconnected_slot();private:Ui::cli *ui;QTcpSocket *socket;QString username;
};
#endif // CLI_H
cli.cpp
#include "cli.h"
#include "ui_cli.h"cli::cli(QWidget *parent): QWidget(parent), ui(new Ui::cli)
{ui->setupUi(this);socket=new QTcpSocket(this);ui->disconnectbtn->setEnabled(false);ui->sendbtn->setEnabled(false);ui->msgedit->setEnabled(false);connect(socket,&QTcpSocket::connected,this,&cli::connected_slot);connect(socket,&QTcpSocket::readyRead,this,&cli::readyRead_slot);connect(socket, &QTcpSocket::disconnected, this, &cli::disconnected_slot);
}cli::~cli()
{delete ui;
}void cli::on_connectbtn_clicked()
{username=ui->usernameedit->text();QString ip=ui->ipedit->text();quint16 port=ui->portedit->text().toUInt();socket->connectToHost(ip,port);
}void cli::connected_slot(){ui->disconnectbtn->setEnabled(true);ui->sendbtn->setEnabled(true);ui->msgedit->setEnabled(true);ui->usernameedit->setEnabled(false);ui->ipedit->setEnabled(false);ui->portedit->setEnabled(false);ui->connectbtn->setEnabled(false);QMessageBox::information(this,"成功","成功进入聊天室");QString msg=username+": 进入聊天室";socket->write(msg.toLocal8Bit());
}void cli::readyRead_slot(){QByteArray msg=socket->readAll();ui->msgwidget->addItem(QString::fromLocal8Bit(msg));
}void cli::on_sendbtn_clicked()
{QString msg=username+": "+ui->msgedit->text();socket->write(msg.toLocal8Bit());ui->msgedit->clear();
}void cli::on_disconnectbtn_clicked()
{QString msg=username+": 离开聊天室";socket->write(msg.toLocal8Bit());socket->disconnectFromHost();
}void cli::disconnected_slot(){ui->disconnectbtn->setEnabled(false);ui->sendbtn->setEnabled(false);ui->msgedit->setEnabled(false);ui->usernameedit->setEnabled(true);ui->ipedit->setEnabled(true);ui->portedit->setEnabled(true);ui->connectbtn->setEnabled(true);QMessageBox::information(this,"退出","退出成功");
}
效果图
绘制一个时钟
clockwidget.h
#ifndef CLOCKWIDGET_H
#define CLOCKWIDGET_H#include <QWidget>
#include<QPainter>
#include<QTimer>
#include<QTime>class ClockWidget : public QWidget
{Q_OBJECT
public:ClockWidget(QWidget *parent = nullptr);protected:void paintEvent(QPaintEvent *);
};#endif // CLOCKWIDGET_H
clockwidget.cpp
#include "clockwidget.h"ClockWidget::ClockWidget(QWidget *parent) : QWidget(parent)
{setFixedSize(400, 400);QTimer *timer = new QTimer(this);connect(timer, &QTimer::timeout, this, QOverload<>::of(&ClockWidget::update));timer->start(1000);
}void ClockWidget::paintEvent(QPaintEvent *)
{QPainter painter(this);QTime currentTime = QTime::currentTime();painter.setRenderHint(QPainter::Antialiasing, true);painter.translate(width() / 2, height() / 2);painter.scale(width() / 200.0, height() / 200.0);painter.setPen(Qt::NoPen);painter.setBrush(Qt::white);painter.drawEllipse(QPoint(0, 0), 90, 90);painter.setPen(Qt::black);for (int i = 1; i <= 12; ++i) {painter.drawLine(0, 70, 0, 80);painter.rotate(30);}painter.setPen(Qt::gray);for (int i = 0; i < 60; ++i) {if (i % 5 != 0)painter.drawLine(0, 70, 0, 75);painter.rotate(6);}//时针painter.setPen(Qt::black);painter.save();painter.rotate(30.0 * ((currentTime.hour() + currentTime.minute() / 60.0)));painter.drawLine(0, 0, 0, -40);painter.restore();//分针painter.setPen(Qt::blue);painter.save();painter.rotate(6.0 * ((currentTime.minute() + currentTime.second() / 60.0)));painter.drawLine(0, 0, 0, -60);painter.restore();//秒针painter.setPen(Qt::red);painter.save();painter.rotate(6.0 * currentTime.second());painter.drawLine(0, 0, 0, -70);painter.restore();painter.setPen(Qt::black);painter.setBrush(Qt::black);painter.drawEllipse(QPoint(0, 0), 3, 3);
}
效果图
查看全文
99%的人还看了
相似问题
- Docker篇之利用docker搭建ftp服务器可实现多用户上传
- 【Vue3】解决Vue打包后上传服务器 资源路径加载错误
- 【史上最细教程】服务器MySQL数据库完成主从复制
- 中间件安全:Apache Tomcat 弱口令.(反弹 shell 拿到服务器的最高控制权.)
- 服务器端请求伪造(SSRF)
- VMware 系列:戴尔服务器配置(格式数据、RAID5、安装ESXI)以及相关问题
- 超详细 | 实验室linux服务器非root账号 | 安装pip | 安装conda
- 腾讯云4核8G服务器配置价格表,轻量和CVM标准型S5实例
- 推荐一个windows上传linux服务器/linux服务器的docker镜像的工具,摆脱docker cp,以及解决常见问题。
- 2.6文件服务器
猜你感兴趣
版权申明
本文"Qt(day4)":http://eshow365.cn/6-10451-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!
- 上一篇: flutter iOS 缺少通知权限,缺少位置权限
- 下一篇: 什么情况下使用微服务?