最近开发了一个Super Helpdesk的项目, 在聊天模块,使用QMap储存发送过来的用户名和ip地址,利用QMultiMap存储送过来的消息,在有聊天的时候消息自动发送到all messages并存储在Qmultimap里面,当用户双击chat list的用户时候,自动调入相应用户的聊天信息,
和IP 地址,这样就实现了不切换界面来实现一对多聊天。如何分辨用户名字,在之前的帖子里面有说,可以参考一下,这个方案只是利用了mysql存储的IP地址,去掉了聊天服务器(上线即自动update IP地址到mysql服务器)。 谢谢各位网友分享的资料。具体程序请访问
www.pavogroup.top 下载。
![]()
void EngineerWindow::on_readyRead()
{
//是否还有待读取的传入数据报
while(m_udpSocket->hasPendingDatagrams())
{
QByteArray data;
//返回待读取的数据报的字节数
data.resize(m_udpSocket->pendingDatagramSize());
// QHostAddress peerAddr;
// quint16 peerPort;
//读取数据报的内容
m_udpSocket->readDatagram(data.data(),data.size(),&peerAddr,&peerPort);
senderPeerAddress = peerAddr;
QString str = data.data();
QStringList list = str.split("///");
senderName = list.at(list.length()-1);
strReceiveWithoutName = list.at(list.length ()-2);
// QString peer = "[From ] +"+peerAddr.toString()+":"+QString::number(peerPort)+"] ";
sendTitle = "[From "+senderName+ "-" + QTime::currentTime ().toString () + "]: ";
// ui->plainTextEdit_Chat_Messages->appendPlainText(peer+str);
QTextCharFormat fmt;
//字体色
strReceiveWithoutNameEmit = strReceiveWithoutName;
senderNameEmit = senderName;
senderPeerAddressEmit = senderPeerAddress;
// QString messageForwardToChatForm = sendTitle + strReceiveWithoutName;
//on_readyReadEmit();
if(ui->label_ChatWithName->text ().isEmpty () || ui->label_ChatWithName->text () == senderName)
{
ui->label_ChatWithName->setText (senderName);
fmt.setForeground(QBrush(Qt::blue));
ui->plainTextEdit_Chat_Messages->mergeCurrentCharFormat(fmt);
ui->plainTextEdit_Chat_Messages->appendPlainText(sendTitle+strReceiveWithoutName);
dstIP = peerAddr.toString ();
}
if(senderName != senderNameTempForColor)
{
senderNameTempForColor = senderName;
QTextCharFormat fmt;
//字体色
fmt.setForeground(QBrush(QColor::fromHsl(rand()%360,rand()%256,rand()%200)));
ui->plainTextEdit_Chat_Messages_All->mergeCurrentCharFormat(fmt);
ui->plainTextEdit_Chat_Messages_All->appendPlainText(sendTitle+strReceiveWithoutName);
}
else
{
ui->plainTextEdit_Chat_Messages_All->appendPlainText(sendTitle+strReceiveWithoutName);
}
QTableWidgetItem *senderItem = new QTableWidgetItem;
senderItem->setText(senderName);
QTableWidgetItem *peerAddrItem = new QTableWidgetItem;
peerAddrItem->setText(peerAddr.toString ());
ui->tableWidget_Engineer_ChatList->setRowCount(chatList.count ()+1);
if(!chatList.contains (senderName))
{
chatList.insert (senderName, peerAddr);
ui->tableWidget_Engineer_ChatList->setItem (chatListRow, chatListCol1, senderItem);
ui->tableWidget_Engineer_ChatList->setItem (chatListRow, chatListCol2, peerAddrItem);
chatListRow++;
}
else
{
chatList.remove (senderName);
QTest::qSleep (20);
chatList.insert (senderName, peerAddr);
if(!ui->tableWidget_Engineer_ChatList->size ().isEmpty ())
{
for(int row = ui->tableWidget_Engineer_ChatList->rowCount()-1; row >=0; row--)
{
if(ui->tableWidget_Engineer_ChatList->item(row,0)==nullptr || ui->tableWidget_Engineer_ChatList->item(row,1)->text().isEmpty())
{
}
else
{
QString item1 = ui->tableWidget_Engineer_ChatList->item(row,0)->text ();
QString item2 = ui->tableWidget_Engineer_ChatList->item(row,1)->text ();
if(item1 == senderName && item2 != peerAddr.toString ())
{
ui->tableWidget_Engineer_ChatList->setItem (row, chatListCol1, senderItem);
ui->tableWidget_Engineer_ChatList->setItem (row, chatListCol2, peerAddrItem);
// chatListRow++;
}
}
}
}
}
chatMessages.insertMulti (senderName, sendTitle+strReceiveWithoutName);
delete senderItem;
delete peerAddrItem;
}
}
void EngineerWindow::on_pushButton_Chat_SendMessage_clicked()
{
if(ui->plainTextEdit_Send_Messages->document ()->isEmpty ())
{
QMessageBox::warning (this, "Remind", "You could not send empty message out!");
return;
}
if(ui->label_ChatWithName->text ()== "")
{
QMessageBox::information (this, "Remind","Pls double click on the contact list to choose who are you want to talk first.");
return;
}
QString chatWithName = ui->label_ChatWithName->text ();
QHostAddress dstAddr(dstIP);
//目标端口
quint16 dstPort = 8686; //= ui->lineEdit_SendTo_Port->text().toInt ();
QString msg = ui->plainTextEdit_Send_Messages->toPlainText () + "///" + WindowsUserName;
QByteArray str = msg.toUtf8();
//发出数据报
m_udpSocket->writeDatagram(str,dstAddr,dstPort);
QTextCharFormat fmt;
//字体色
fmt.setForeground(QBrush(Qt::darkRed));
QString msgLocal = ui->plainTextEdit_Send_Messages->toPlainText ();
ui->plainTextEdit_Chat_Messages->mergeCurrentCharFormat(fmt);
ui->plainTextEdit_Chat_Messages->appendPlainText("[To " + chatWithName + "-" + QTime::currentTime ().toString () + "]: "+msgLocal);
chatMessages.insertMulti (chatWithName, "[To " + chatWithName + "-" + QTime::currentTime ().toString () + "]: "+msgLocal);
ui->plainTextEdit_Send_Messages->clear ();
}