用Qt设计一款聊天软件,聊天室人数上限20人的代码。
时间: 2023-12-06 15:44:18 浏览: 25
以下是一个简单的Qt聊天室软件的代码示例,聊天室人数上限为20人:
mainwindow.h
```c++
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QTcpSocket>
#include <QTcpServer>
#include <QList>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
void on_sendButton_clicked();
void newConnection();
void readMessage();
void displayError(QAbstractSocket::SocketError socketError);
private:
Ui::MainWindow *ui;
QTcpServer *tcpServer;
QTcpSocket *tcpSocket;
QList<QTcpSocket*> clients;
};
#endif // MAINWINDOW_H
```
mainwindow.cpp
```c++
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMessageBox>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
tcpServer = new QTcpServer(this);
tcpSocket = new QTcpSocket(this);
if (!tcpServer->listen(QHostAddress::Any, 8888))
{
QMessageBox::critical(this, tr("Error"), tr("Unable to start the server: %1.").arg(tcpServer->errorString()));
close();
}
connect(tcpServer, SIGNAL(newConnection()), this, SLOT(newConnection()));
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_sendButton_clicked()
{
QString message = ui->messageEdit->toPlainText();
if (message.isEmpty())
return;
QByteArray block;
QDataStream out(&block, QIODevice::WriteOnly);
out.setVersion(QDataStream::Qt_5_15);
out << message;
for (int i = 0; i < clients.size(); i++)
{
clients[i]->write(block);
}
ui->messageEdit->clear();
}
void MainWindow::newConnection()
{
tcpSocket = tcpServer->nextPendingConnection();
if (clients.size() >= 20)
{
tcpSocket->close();
return;
}
clients.append(tcpSocket);
connect(tcpSocket, SIGNAL(readyRead()), this, SLOT(readMessage()));
connect(tcpSocket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(displayError(QAbstractSocket::SocketError)));
}
void MainWindow::readMessage()
{
for (int i = 0; i < clients.size(); i++)
{
QByteArray buffer = clients[i]->readAll();
QString message = QString::fromUtf8(buffer.data(), buffer.size());
ui->chatEdit->append(message);
}
}
void MainWindow::displayError(QAbstractSocket::SocketError socketError)
{
if (socketError == QTcpSocket::RemoteHostClosedError)
return;
QTcpSocket *socket = qobject_cast<QTcpSocket*>(sender());
QMessageBox::critical(this, tr("Error"), tr("Socket error: %1").arg(socket->errorString()));
clients.removeAll(socket);
socket->deleteLater();
}
```
在这个示例中,我们使用了QTcpServer和QTcpSocket来处理连接和通信。当新的连接建立时,我们将客户端的QTcpSocket对象添加到一个QTcpSocket列表中。如果客户端数量超过20个,我们将关闭新连接并不接受它。当客户端发送消息时,我们将消息广播给所有其他客户端。如果有任何错误,我们将从客户端列表中删除QTcpSocket对象。
请注意,这只是一个简单的示例,并且需要进行更多的测试和改进才能用于实际应用程序。