Widget::Widget(QWidget *parent, QString usrname) : QWidget(parent), ui(new Ui::Widget) { ui->setupUi(this); uName = usrname; udpSocket = new QUdpSocket(this); port = 23232; udpSocket->bind(port, QUdpSocket::ShareAddress|QUdpSocket::ReuseAddressHint); connect(udpSocket,SIGNAL(readyRead()), this, SLOT(processPendingDatagrams()));//随时接收来自其他用户的UDP广播消息 sndMsg(UsrEnter); srv = new Server(this); connect(srv, SIGNAL(sndFileName(QString)), this, SLOT(getFileName(QString))); } Widget::~Widget() { delete ui; } //处理新用户加入 void Widget::usrEnter(QString usrname, QString ipaddr) { bool isEmpty = ui->usrTblWidget->findItems(usrname, Qt::MatchExactly).isEmpty(); if (isEmpty) { QTableWidgetItem *usr = new QTableWidgetItem(usrname); QTableWidgetItem *ip = new QTableWidgetItem(ipaddr); ui->usrTblWidget->insertRow(0); ui->usrTblWidget->setItem(0, 0, usr); ui->usrTblWidget->setItem(0, 1, ip); ui->msgBrowser->setTextColor(Qt::gray); ui->msgBrowser->setCurrentFont(QFont("Times New Roman", 10)); ui->msgBrowser->append(tr("%1 在线!").arg(usrname)); ui->usrNumLbl->setText(tr("在线人数: 1%").arg(ui->usrTblWidget->rowCount())); sndMsg(UsrEnter);//在线的各个端口也要告诉新加入的断点它们自己的用户信息 } } void Widget::usrLeft(QString usrname, QString time) { int rowNum = ui->usrTblWidget->findItems(usrname, Qt::MatchExactly).first()->row(); ui->usrTblWidget->removeRow(rowNum); ui->msgBrowser->setTextColor(Qt::gray); ui->msgBrowser->setCurrentFont(QFont("Times New Roman", 10)); ui->msgBrowser->append(tr("%1 于 %2 离开!").arg(usrname).arg(time)); ui->usrNumLbl->setText(tr(" 在 线 人 数 : %1").arg(ui->usrTblWidget->rowCount())); }
时间: 2024-04-02 15:32:40 浏览: 133
这段代码是一个Qt的Widget类的成员函数,主要实现了处理新用户加入和用户离开的功能。具体来说,当一个新用户加入聊天室时,会在聊天室的用户列表中添加该用户的用户名和IP地址,并向聊天室中的其他用户发送UDP广播消息通知他们有新用户加入了聊天室。当一个用户离开聊天室时,会从用户列表中移除该用户的信息,并向聊天室中的其他用户发送UDP广播消息通知他们该用户已经离开聊天室。
在代码中,变量uName表示当前用户的用户名,udpSocket表示用于接收UDP广播消息的套接字,srv表示用于处理文件传输的服务器对象。在构造函数中,首先绑定了UDP套接字,并且连接了readyRead()信号与processPendingDatagrams()槽,以便随时接收来自其他用户的UDP广播消息。然后调用了sndMsg函数向聊天室中的其他用户发送UDP广播消息,表示当前用户已经加入聊天室。最后创建了一个服务器对象,连接了其sndFileName信号与getFileName槽,以便在文件传输时获取文件名。
在usrEnter函数中,首先判断该用户是否已经在用户列表中,如果不在,则创建一个新的用户表项,并在用户列表中插入该项。然后向聊天室中的其他用户发送UDP广播消息,通知他们有新用户加入了聊天室。最后将在线人数显示在用户界面上。
在usrLeft函数中,首先找到该用户在用户列表中的行数,并从用户列表中移除该用户的信息。然后向聊天室中的其他用户发送UDP广播消息,通知他们该用户已经离开聊天室。最后将在线人数显示在用户界面上。
相关问题
class Widget : public QWidget { Q_OBJECT public: explicit Widget(QWidget *parent, QString usrname); ~Widget();标准化一下
class Widget : public QWidget {
Q_OBJECT
public:
explicit Widget(QWidget *parent, QString usrname);
~Widget();
};
这是一个标准的类定义,继承自QWidget类,并使用Q_OBJECT宏,以便在该类中使用信号和槽机制。该类具有一个构造函数和析构函数,构造函数接受一个QWidget类型的指针和一个QString类型的用户名作为参数。
#ifndef MYENROLL_H #define MYENROLL_H #include <QWidget> #include <QLabel> #include <QPushButton> #include <QLineEdit> #include <QHBoxLayout> #include <QVBoxLayout> #include <QPixmap> class myenroll : public QWidget { Q_OBJECT public: explicit myenroll(QWidget *parent = nullptr); void init_ui(); QLineEdit * name; QLineEdit * pass; QLabel * lb1; QLabel * lb2; QPushButton * bnt1; QHBoxLayout * hb1; QHBoxLayout * hb2; QHBoxLayout * hb3; QVBoxLayout * vb1; signals: void sig_enroll_info(QString usrname, QString usrpass); //自定义的注册信号,发送给myapp public slots: void send_msg(); }; #endif // MYENROLL_H
这段代码定义了一个名为myenroll的QWidget类,该类包含一个构造函数和一个名为init_ui的函数。该类具有以下公共成员:
- QLineEdit * name:一个指向QLineEdit对象的指针,用于输入用户名。
- QLineEdit * pass:一个指向QLineEdit对象的指针,用于输入密码。
- QLabel * lb1:一个指向QLabel对象的指针,用于显示“用户名”文本。
- QLabel * lb2:一个指向QLabel对象的指针,用于显示“密码”文本。
- QPushButton * bnt1:一个指向QPushButton对象的指针,用于触发注册操作。
- signals: void sig_enroll_info(QString usrname, QString usrpass):自定义的注册信号,发送给myapp。
- public slots: void send_msg():一个槽函数,用于发送注册信息。
该类还包含多个水平和垂直布局,用于排列UI元素。
阅读全文