日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Qt 聊天室的实现

發布時間:2023/12/20 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Qt 聊天室的实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

效果展示


該項目包括布局,QListWidget控件的點擊
包括qt Qtcpsocket的使用

#ifndef DENGLU_H #define DENGLU_H#include <QWidget>namespace Ui { class denglu; }class denglu : public QWidget {Q_OBJECTpublic:explicit denglu(QWidget *parent = nullptr);~denglu();private:Ui::denglu *ui;//向量容器QVector<bool> IsShow; };#endif // DENGLU_H

實現代碼

#include "denglu.h" #include "ui_denglu.h" #include<QIcon> #include<QToolButton> #include"widget.h" #include<QMessageBox> denglu::denglu(QWidget *parent) :QWidget(parent),ui(new Ui::denglu) {ui->setupUi(this);//設置圖標//路徑: 冒號+前綴+路徑this->setWindowIcon(QIcon(":/images/qq.png"));//設置名稱this->setWindowTitle("qq 2020");QList<QString> nameList;nameList<<"性感小飛俠"<<"悶騷男"<<"韓國歐巴"<<"神經病一枚"<<"笨笨豬"<<"狗頭"<<"蛇精病"<<"尼古拉斯趙四"<<"本山兄弟";QStringList iconNameList; //圖標資源列表iconNameList << "spqy"<< "ymrl" <<"qq" <<"Cherry"<< "dr"<<"jj"<<"lswh"<<"qmnn"<<"spqy";QVector< QToolButton *> vector;for(int i=0;i<9;i++){QToolButton *btn=new QToolButton(this);//加載圖標btn->setIcon(QPixmap(QString(":/images/%1.png").arg(iconNameList[i])));//設置圖片大小btn->setIconSize(QPixmap(QString(":/images/%1.png").arg(iconNameList[i])).size());//設置網名btn->setText(QString("%1").arg(nameList[i]));//設置為透明btn->setAutoRaise(true);//設置顯示格式btn->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);//放到vlayout布局中ui->vlayout->addWidget(btn);vector.push_back(btn);IsShow.push_back(false);}for(int i=0;i<9;i++){connect(vector[i],&QToolButton::clicked,[=](){if(IsShow[i]){QMessageBox::warning(this,"警告","該聊天框已被打開!");return;}IsShow[i]=true;Widget *widget=new Widget(nullptr,vector[i]->text());widget->setWindowIcon(vector[i]->icon());widget->setWindowTitle(vector[i]->text());widget->show();//關閉時將對應的IsShow變為false;connect(widget,&Widget::closeWidget,this,[=](){IsShow[i]=false;});});}} denglu::~denglu() {delete ui; }

對話窗口類

#ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include<QUdpSocket> namespace Ui { class Widget; }class Widget : public QWidget {Q_OBJECTpublic:explicit Widget(QWidget *parent,QString name);//重寫關閉事件void closeEvent(QCloseEvent *);enum Msgtype{Msg,UserEnter,UserLeft};//枚舉 分別代表 普通信息 用戶進入 用戶離開void sndMsg(Msgtype type);//廣播udp信息QString getName();//獲取名字QString getMsg();//獲取聊天信息void userEnter(QString username);//處理用戶進入void userLeft(QString username,QString time);//處理用戶離開void ReceiveMessage(); //接受UDP消息~Widget(); signals:void closeWidget();private:Ui::Widget *ui;QString myname;quint16 port;//端口QUdpSocket *udpSocket;//udp 套接字 };#endif // WIDGET_H

對話窗口實現

#include "widget.h" #include "ui_widget.h" #include<QDataStream> #include<QMessageBox> #include<QDateTime> #include<QComboBox> #include<QColorDialog> #include<QFileDialog> Widget::Widget(QWidget *parent ,QString name) :QWidget(parent),ui(new Ui::Widget) {ui->setupUi(this);myname=name;this->port=9999;this->udpSocket=new QUdpSocket(this);udpSocket->bind(port,QUdpSocket::ShareAddress |QUdpSocket::ReuseAddressHint);//connect(udpSocket,&QUdpSocket::readyRead,this,&Widget::ReceiveMessage);//連接發送按鈕connect(ui->sendBtn,&QPushButton::clicked,[=](){sndMsg(Msg);});//新用戶進入sndMsg(UserEnter);connect(ui->exitBtn,&QPushButton::clicked,[=](){this->close();});//字體類型connect(ui->fontCbx,&QFontComboBox::currentFontChanged,[=](const QFont &font){ui->msgTxtEdit->setFontFamily(font.toString());ui->msgTxtEdit->setFocus();});//字體大小void (QComboBox:: * sizebtn)(const QString &text)=&QComboBox::currentTextChanged;connect(ui->sizeCbx,sizebtn,[=](const QString &text){ui->msgTxtEdit->setFontPointSize(text.toDouble());ui->msgTxtEdit->setFocus();});//字體的加粗connect(ui->boldTBtn,&QToolButton::clicked,[=](bool checked){if(checked){ui->msgTxtEdit->setFontWeight(QFont::Bold);}else {ui->msgTxtEdit->setFontWeight(QFont::Normal);}});//字體傾斜connect(ui->italicTbtn,&QToolButton::clicked,[=](bool checked){ui->msgTxtEdit->setFontItalic(checked);ui->msgTxtEdit->setFocus();});//字體下劃線connect(ui->underlineTBtn,&QToolButton::clicked,[=](bool checked){ui->msgTxtEdit->setFontUnderline(checked);ui->msgTxtEdit->setFocus();});//清空功能connect(ui->clearTBtn,&QToolButton::clicked,[=](){ui->msgBrowser->clear();});connect(ui->colorTBtn,&QToolButton::clicked,[=](){QColor color=QColorDialog::getColor(color,this);ui->msgTxtEdit->setTextColor(color);});connect(ui->saveTBtn,&QToolButton::clicked,[=](){if(ui->msgBrowser->toPlainText().isEmpty()){QMessageBox::warning(this,"警告","警告!保存內容不能為空!");return;}QString filename=QFileDialog::getSaveFileName(this,"保存聊天記錄","聊天記錄","(*.txt)");if(!filename.isEmpty()){QFile file(filename);file.open(QIODevice::WriteOnly | QFile::Text);QTextStream stream(&file);stream<<ui->msgBrowser->toPlainText();file.close();}}); }void Widget::closeEvent(QCloseEvent *e) {emit this->closeWidget();sndMsg(UserLeft);udpSocket->close();udpSocket->destroyed();QWidget::closeEvent(e); }void Widget::sndMsg(Widget::Msgtype type) {QByteArray array;QDataStream stream(&array,QIODevice::WriteOnly);stream<<type<<this->getName();switch (type){case Msg:if(ui->msgTxtEdit->toPlainText()==""){QMessageBox::warning(this,"警告","發送的聊天內容不能為空!");return;}stream<<this->getMsg();break;case UserEnter:break;case UserLeft:break;}//書寫報文udpSocket->writeDatagram(array.data(),array.size(),QHostAddress::Broadcast,this->port); }QString Widget::getName() {return this->myname; }QString Widget::getMsg() {QString msg=ui->msgTxtEdit->toHtml();ui->msgTxtEdit->clear();ui->msgTxtEdit->setFocus();return msg; } void Widget::userEnter(QString username) {bool IsEmpty=ui->tableWidget->findItems(username,Qt::MatchExactly).isEmpty();if(IsEmpty){QTableWidgetItem *table=new QTableWidgetItem(username);ui->tableWidget->insertRow(0);ui->tableWidget->setItem(0,0,table);ui->msgBrowser->setTextColor(QColor(Qt::gray));ui->msgBrowser->append(username+"已上線");ui->userNumLbl->setText(QString("在線人數:%1").arg(ui->tableWidget->rowCount()));sndMsg(UserEnter);} }void Widget::userLeft(QString username, QString time) {bool IsEmpty=ui->tableWidget->findItems(username,Qt::MatchExactly).isEmpty();if(!IsEmpty){int row=ui->tableWidget->findItems(username,Qt::MatchExactly).first()->row();ui->tableWidget->removeRow(row);ui->msgBrowser->append(QString("%1用戶于%2離開").arg(username).arg(time));ui->userNumLbl->setText(QString("在線人數:%1").arg(ui->tableWidget->rowCount()));} }void Widget::ReceiveMessage() {qint64 size=udpSocket->pendingDatagramSize();int mysize= static_cast<int>(size);QByteArray *array=new QByteArray(mysize,0);udpSocket->readDatagram((*array).data(),size);QDataStream stream(array,QIODevice::ReadOnly);int mytype;QString name,msg;//用戶名 聊天內容QString time=QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss");stream>>mytype;switch (mytype) {case Msg:stream>>name>>msg;ui->msgBrowser->setTextColor(QColor(Qt::blue));ui->msgBrowser->append("["+name+"]"+time);ui->msgBrowser->append(msg);break;case UserLeft:stream>>name;userLeft(name,time);break;case UserEnter:stream>>name;userEnter(name);break;}} Widget::~Widget() {delete ui; }

總結

以上是生活随笔為你收集整理的Qt 聊天室的实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。