当前位置:首页 > 编程笔记 > 正文
已解决

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%的人还看了

猜你感兴趣

版权申明

本文"Qt(day4)":http://eshow365.cn/6-10451-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!