diff --git a/src/chatdialog.cpp b/src/chatdialog.cpp index 79fe274..37d3a6e 100644 --- a/src/chatdialog.cpp +++ b/src/chatdialog.cpp @@ -8,7 +8,11 @@ #include #include #include +#include +QString strFilePath; +int savepos; +QTextCursor save; QMap ChatDialog::openedDialogs; ChatDialog::ChatDialog(QWidget *parent) : @@ -35,20 +39,6 @@ ChatDialog::ChatDialog(QWidget *parent) : plainFormat.setFont(QFont("微软雅黑",10)); plainFormat.setForeground(Qt::black); - //设置按钮1,默认是表情按钮 - QPixmap button1; - button1.load(":/images/1.png"); - button1.scaled(20,20); - ui->button1->setPixmap(button1); - ui->button1->setScaledContents(true); - - //设置按钮2,图片按钮 - QPixmap button2; - button2.load(":/images/2.png"); - button2.scaled(20,20); - ui->button2->setPixmap(button2); - ui->button2->setScaledContents(true); - connect(Nowe::myClient(), &QXmppClient::messageReceived, this, &ChatDialog::on_messageReceived); connect(this, &ChatDialog::newMessage, [=](QString sender,QString receiver,QDateTime time,QString content) { QXmppMessage msg(sender, receiver, content); @@ -56,6 +46,13 @@ ChatDialog::ChatDialog(QWidget *parent) : msg.setStamp(time); Nowe::myClient()->sendPacket(msg); }); + connect(this, &ChatDialog::newPicture, [=](QString sender,QString receiver,QDateTime time,QString content) { + QXmppMessage msg(sender, receiver, content); + msg.setType(QXmppMessage::Chat); + msg.setStamp(time); + Nowe::myClient()->sendPacket(msg); + }); + save=ui->messBox->textCursor(); savepos=ui->messBox->textCursor().position(); @@ -88,7 +85,7 @@ void ChatDialog::insertOutMessage(QString msg) cursor.setCharFormat(plainFormat); ui->messBox->moveCursor(QTextCursor::End); cursor.insertText(msg); - //cursor.insertText("\n"); + cursor.insertText("\n"); save=ui->messBox->textCursor(); savepos=ui->messBox->textCursor().position(); scrollBarAdjust(); @@ -117,6 +114,40 @@ void ChatDialog::insertInMessage(QString msg,QDateTime *time) scrollBarAdjust(); } +void ChatDialog::insertOutPicture(QImage *image) +{ + ui->messBox->moveCursor(QTextCursor::End); + QTextCursor cursor=ui->messBox->textCursor(); + ui->messBox->moveCursor(QTextCursor::End); + cursor.insertBlock(outMsgFormat); + ui->messBox->moveCursor(QTextCursor::End); + cursor.insertImage(*image); + cursor.insertText("\n"); + save=ui->messBox->textCursor(); + savepos=ui->messBox->textCursor().position(); + scrollBarAdjust(); +} + +void ChatDialog::insertInPicture(QImage *image,QDateTime *time) +{ + ui->messBox->moveCursor(QTextCursor::End); + QTextCursor cursor=ui->messBox->textCursor(); + cursor.insertBlock(inMsgFormat); + cursor.setCharFormat(inMsgCharFormat); + cursor.insertText(receiver); + cursor.insertText(" "); + if(time==nullptr) + //如果没有传入时间,就用系统当前时间 + cursor.insertText(QDateTime::currentDateTime().toString(timeFormat)); + else + cursor.insertText(time->toString(timeFormat)); + cursor.insertText("\n"); + + cursor.insertImage(*image); + cursor.insertText("\n"); + scrollBarAdjust(); +} + void ChatDialog::setUserName(QString usr) { //设置用户名,显示在每次发消息的消息标题上 @@ -177,9 +208,29 @@ void ChatDialog::setOutMsgFormat(QFont target,Qt::GlobalColor color) void ChatDialog::on_messageReceived(const QXmppMessage &msg) { - if (QXmppUtils::jidToBareJid(msg.from()) == bareJid) { + if (QXmppUtils::jidToBareJid(msg.from()) == bareJid) + { auto time = msg.stamp(); - insertInMessage(msg.body(), &time); + + if(msg.body().mid(0,3)=="URL") + { + QString url_string=msg.body().mid(4,-1); + QUrl url(url_string); + qDebug()<<"QUrl="<get(request); + } + else + { + insertInMessage(msg.body(), &time); + } } } @@ -230,9 +281,47 @@ void ChatDialog::scrollBarAdjust() void ChatDialog::on_sendBtn_clicked() { //点击发送按钮后发射信号,清空文本区 - insertOutMessage(ui->contentBox->toPlainText()); - emit newMessage(sender,receiver,QDateTime::currentDateTime(),ui->contentBox->toPlainText()); + QString text=ui->contentBox->toPlainText(); + + insertOutMessage(text); + if(!strFilePath.isEmpty()) + text=QString("发送了一个图片 ")+text; + emit newMessage(sender,receiver,QDateTime::currentDateTime(),text); + + + if(!strFilePath.isEmpty()) + { + QHttpMultiPart *multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType); + + QHttpPart imagePart; + imagePart.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("image/png")); + imagePart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"smfile\"; filename=\"image.png\"")); + + QFile *file = new QFile(strFilePath); + if(!file->open(QIODevice::ReadOnly)) + { + qDebug()<append(imagePart); + } + + QNetworkRequest request; + request.setUrl(QUrl("https://sm.ms/api/upload")); + //网络载体 + QNetworkAccessManager *networkAccessManager1=new QNetworkAccessManager(this); + //网络载体的响应接收信号,与响应接收槽绑定 + connect(networkAccessManager1, SIGNAL(finished(QNetworkReply*)), this, SLOT(Generatelink(QNetworkReply*))); + networkAccessManager1->post(request,multiPart); + insertOutPicture(image); + } + + //clear ui->contentBox->clear(); + picUrl=""; + strFilePath=""; } void ChatDialog::on_cancleBtn_clicked() @@ -280,5 +369,83 @@ void ChatDialog::closeChatDialog(ChatDialog *dialog) QString jid=openedDialogs.key(dialog); QMap::iterator i= openedDialogs.find(jid); openedDialogs.erase(i); - qDebug()<<" erase!"; + qDebug()<load(strFilePath); + image->scaled(40,30,Qt::IgnoreAspectRatio, Qt::SmoothTransformation); + + ui->contentBox->moveCursor(QTextCursor::End); + QTextCursor cursor=ui->contentBox->textCursor(); + cursor.insertImage(*image); + } + +void ChatDialog::Generatelink(QNetworkReply* reply) +{ + int statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); + qDebug() <error() == QNetworkReply::NoError) + { + QByteArray allData = reply->readAll(); + QJsonParseError json_error; + QJsonDocument jsonDoc(QJsonDocument::fromJson(allData, &json_error)); + if(json_error.error != QJsonParseError::NoError) + { + qDebug() <deleteLater(); +} + +void ChatDialog::LoadPicture(QNetworkReply *reply) +{ + qDebug() << QString("reply :") << reply<< endl; + + if(reply->error() == QNetworkReply::NoError) + { + QByteArray data_bytes = reply->readAll(); + + QImage *image_in=new QImage(); + image_in->loadFromData(data_bytes); + image_in->scaled(40,30,Qt::IgnoreAspectRatio, Qt::SmoothTransformation); + insertInPicture(image_in,nullptr); + } + reply->deleteLater(); + +} + diff --git a/src/chatdialog.h b/src/chatdialog.h index ffa34c6..4eaea6c 100644 --- a/src/chatdialog.h +++ b/src/chatdialog.h @@ -5,8 +5,14 @@ #include #include #include -#include #include +#include +#include +#include +#include +#include +#include + namespace Ui { class ChatDialog; @@ -39,6 +45,11 @@ class ChatDialog : public NoweBaseWindow void setBareJid(const QString &value); void scrollBarAdjust(); + void insertOutPicture(QImage *image); + void insertInPicture(QImage *image,QDateTime *time); + + + private: Ui::ChatDialog *ui; QTextDocument *document; @@ -52,8 +63,11 @@ class ChatDialog : public NoweBaseWindow QString receiver; QString timeFormat; QPixmap *avatar; - QTextCursor save; - int savepos; + + QImage *image; + QString picUrl; + + public slots: void on_messageReceived(const QXmppMessage &msg); @@ -61,10 +75,16 @@ public slots: signals: void newMessage(QString sender,QString receiver,QDateTime time,QString content); + void newPicture(QString sender,QString receiver,QDateTime time,QString content); + private slots: void on_cancleBtn_clicked(); void on_sendBtn_clicked(); void on_messBox_cursorPositionChanged(); + + void on_photoBtn_clicked(); + void Generatelink(QNetworkReply* reply); + void LoadPicture(QNetworkReply *reply); }; #endif // CHATDIALOG_H diff --git a/src/chatdialog.ui b/src/chatdialog.ui index 4a25cd9..c003cf8 100644 --- a/src/chatdialog.ui +++ b/src/chatdialog.ui @@ -286,46 +286,43 @@ QScrollBar::add-page:vertical,QScrollBar::sub-page:vertical Qt::Horizontal - + - 10 - 14 - 25 - 25 + 50 + 20 + 111 + 20 - - :hover -{ - background-color: rgb(241, 241, 241); - padding: 3px; -} - - TextLabel + PushButton + + + + :/images/2.png:/images/2.png - + - 46 - 14 - 23 - 23 + 10 + 20 + 111 + 20 - - :hover -{ - background-color: rgb(241, 241, 241); - padding: 3px; -} - - TextLabel + PushButton + + + + :/images/1.png:/images/1.png + line + emojiBtn + photoBtn @@ -436,6 +433,9 @@ QScrollBar::add-page:vertical,QScrollBar::sub-page:vertical 发送 + + Return + @@ -460,6 +460,8 @@ QScrollBar::add-page:vertical,QScrollBar::sub-page:vertical - + + +