当前位置: 首页 > news >正文

濮阳市网站建设自建站

濮阳市网站建设,自建站,怎么利用婚庆网站做营销,山东三强建设咨询有限公司网站上一版代码可以正常使用,但是会报错 上一篇文章 错误信息 "QSocketNotifier: Socket notifiers cannot be enabled or disabled from another thread" 指出了一个问题,即在非主线程中尝试启用或禁用套接字通知器(QSocketNotifier)…

上一版代码可以正常使用,但是会报错

上一篇文章
错误信息 "QSocketNotifier: Socket notifiers cannot be enabled or disabled from another thread" 指出了一个问题,即在非主线程中尝试启用或禁用套接字通知器(QSocketNotifier)。在Qt中,与GUI相关的操作,包括网络操作,通常需要在主线程中进行,因为Qt的GUI不是线程安全的。

在你的代码中,你使用了 QtConcurrent::run 来在后台线程中运行网络操作,这是不正确的,因为Qt的网络类(如QTcpSocket)不是线程安全的。尝试在非主线程中使用它们会导致这个错误。

要解决这个问题,你需要确保所有的网络操作都在主线程中进行。这里有几种方法可以解决这个问题:

  1. 不使用QtConcurrent::run:将网络操作放在主线程中,不使用QtConcurrent::run。这可能不是最佳解决方案,因为它会导致UI线程阻塞,用户体验不佳。

  2. 使用QThread和QObject::moveToThread:创建一个新的QThread,并将网络操作的QObject移动到这个新线程中。这样可以确保网络操作在新线程中运行,而不会干扰主线程。

  3. 使用Qt的网络线程:如果你使用的是QTcpSocket等网络类,可以考虑使用Qt自己的网络线程,例如通过QNetworkAccessManager来处理网络请求。

改进版本(信号与槽机制)

所以,为了改善代码,使用信号与槽机制对网络操作进行改善,通过在主线程触发信号,并传递参数到新线程workerThreadnetworkhandler对象进行数据处理,在触发信号返回主线程更新主线程的响应信息,达到自动化发送邮件的功能

效果展示

效果

networkhandler.h

#ifndef NETWORKHANDLER_H
#define NETWORKHANDLER_H#include <QObject>class NetworkHandler : public QObject
{Q_OBJECT
public:explicit NetworkHandler(QObject *parent = nullptr);void handleData(const QString &data);signals:void updateTextBrowser(const QString &msg);
};#endif // NETWORKHANDLER_H

networkhandler.cpp

#include "networkhandler.h"NetworkHandler::NetworkHandler(QObject *parent): QObject{parent}
{}void NetworkHandler::handleData(const QString &data){if (data.isEmpty()){return;}emit this->updateTextBrowser(data);
}

tcpmailclient.h

#ifndef TCPMAILCLIENT_H
#define TCPMAILCLIENT_H#include <QObject>
#include <QObject>
#include <QtNetwork>
#include <QSslSocket>
#include <QSslCertificate>
#include <QSslKey>
#include <QTcpSocket>
#include <QHostAddress>
#include <QIODevice>
#include <QApplication>
#include <QDebug>class TCPMailClient : public QObject
{Q_OBJECT
public:explicit TCPMailClient(const QString &host, quint16 port,QObject *parent = nullptr);void send(QString msg);QString recieve();void close();private:QSslSocket* ssl;bool isentrcyed = false;signals:void Connected();void readyRead();
};#endif // TCPMAILCLIENT_H

tcpmailclient.cpp

#include "tcpmailclient.h"TCPMailClient::TCPMailClient(const QString &host, quint16 port, QObject *parent): QObject{parent} {this->ssl = new QSslSocket(this);QObject::connect(ssl, &QSslSocket::encrypted, [=]() {this->isentrcyed = true;qDebug() << "连接成功";});QObject::connect(ssl, &QSslSocket::connected, this,[this]() {qDebug() << "已连接到SMTP服务器";emit this->Connected();});// = 是复制要传递的变量, &是引用QObject::connect(ssl,&QSslSocket::readyRead,[&](){emit this->readyRead();});QObject::connect(ssl, &QSslSocket::errorOccurred, this,[](QAbstractSocket::SocketError socketError){qDebug() << "发生错误:" << socketError;});ssl->connectToHostEncrypted(host, port);// 可以连接信号,以确认数据已经发送connect(ssl, &QSslSocket::bytesWritten, this, [](qint64 bytes) {qDebug() << bytes << "bytes were written to the socket.";});
}void TCPMailClient::send(QString msg) {if (ssl->state() == QAbstractSocket::ConnectedState) {qDebug() << "发送" << msg;this->ssl->write(msg.toUtf8());} else {qDebug() << "SMTP连接未建立";}
}QString TCPMailClient::recieve() {// 等待并读取响应// if (ssl->waitForReadyRead()) {//   QByteArray data = ssl->readAll(); // 读取所有可用数据//   qDebug() << "响应内容:" << data;//   return QString(data);// }// return QString();QByteArray data = ssl->readAll(); // 读取所有可用数据qDebug() << "响应内容:" << QString::fromUtf8(data);// return QString(data);return QString::fromUtf8(data); // 编码成字符串
}void TCPMailClient::close()
{ssl->disconnectFromHost();this->ssl->close();
}

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include "networkhandler.h"
#include "tcpmailclient.h"
#include <QWidget>
#include <QtConcurrent/QtConcurrent>
#include <QDebug>
#include <QCoreApplication>
#include <QFuture>
#include <QMessageBox>
QT_BEGIN_NAMESPACE
namespace Ui {
class Widget;
}
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTsignals:void dataReceived(const QString& data);public:Widget(QWidget *parent = nullptr);~Widget();void startWork();void dealWithResponse(const QString& response);private slots:void on_pushButton_clicked();void on_pushButton_2_clicked();private:Ui::Widget *ui;TCPMailClient *mailclient;QThread *workerThread;NetworkHandler * networkhandler;int sendState = 0;bool hassendUsername = false;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
#include <QFuture>
#include <QtConcurrent/QtConcurrent>Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);this->resize(600, 400);this->setWindowIcon(QIcon(":/icon/src/mail_icon.png"));
}Widget::~Widget() {on_pushButton_2_clicked();delete ui;
}void Widget::startWork()
{this->workerThread = new QThread;this->networkhandler = new NetworkHandler();this->networkhandler->moveToThread(workerThread);// 连接信号和槽connect(this, &Widget::dataReceived, networkhandler, &NetworkHandler::handleData);// connect(worker, &Worker::finished, workerThread, &QThread::quit);// connect(worker, &Worker::finished, worker, &Worker::deleteLater);connect(workerThread, &QThread::finished, workerThread, &QThread::deleteLater);// 有新的数据可读时触发readyRead信号connect(mailclient,&TCPMailClient::readyRead,[this](){qDebug() << "触发readyRead信号";QString data = this->mailclient->recieve();emit this->dataReceived(data);});// 通过触发信号回到ui线程更新connect(networkhandler, &NetworkHandler::updateTextBrowser, this,[this](const QString &msg) {// 使用 Qt::QueuedConnection 确保在主线程中执行ui->textBrowser->append(msg);// 更新之后发送对应信息dealWithResponse(msg);}, Qt::QueuedConnection);// 启动线程workerThread->start();}
void Widget::dealWithResponse(const QString& response) {if (response.startsWith("220") && sendState == 0) {// 服务器已准备好接收命令this->mailclient->send("HELO xxx\r\n");sendState = 1; // 移动到下一个状态} else if (response.startsWith("250")) {// 如果服务器回复250,通常表示前一个命令成功执行switch (sendState) {case 1:this->mailclient->send("AUTH LOGIN\r\n");sendState = 2; // 准备发送用户名break;case 5:this->mailclient->send(QString("RCPT TO:<%1>\r\n").arg(ui->lineEdit_4->text()));sendState = 6; // 准备发送邮件数据break;case 6:// 服务器准备接收邮件数据this->mailclient->send("DATA\r\n");sendState = 7; // 邮件数据发送状态case 8:// 已发送退出QMessageBox::information(this,"提示信息","发送成功");break;default:qDebug() << "Unexpected 250 response in state" << sendState;break;}} else if (response.startsWith("334")) {// 服务器要求认证信息if (sendState == 2) {// 发送Base64编码的用户名QString username = QString::fromLatin1(QString("aaaa@163.com").toUtf8().toBase64());this->mailclient->send(username + "\r\n");qDebug() << username;sendState = 3; // 准备发送密码} else if (sendState == 3) {// 发送Base64编码的密码QString password = QString::fromLatin1(QString("MfjaiokgaaLN").toUtf8().toBase64());qDebug() << password;this->mailclient->send(password + "\r\n");sendState = 4; // 完成登录,准备发送MAIL FROM}} else if (response.startsWith("235")) {// 认证成功this->mailclient->send(QString("MAIL FROM:<%1>\r\n").arg(ui->lineEdit_3->text()));sendState = 5; // 准备发送RCPT TO} else if (response.startsWith("354") && sendState == 7) {// 发送邮件数据this->mailclient->send(QString("FROM:%1\r\n").arg(ui->lineEdit_3->text()));this->mailclient->send(QString("SUBJECT:%1\r\n").arg(ui->lineEdit_5->text()));this->mailclient->send(QString("TO:%1\r\n").arg(ui->lineEdit_4->text()));// 发送空行,隔开邮件正文和内容this->mailclient->send("\r\n");this->mailclient->send(ui->textEdit->toPlainText() + "\r\n");this->mailclient->send(".\r\n");this->mailclient->send("QUIT\r\n");// 退出状态sendState = 8;} else if (response.startsWith("5")) {// 5xx表示服务器端的错误qDebug() << "服务端报错" << response;} else {// 未识别的响应qDebug() << "Unrecognized SMTP response:" << response;}
}// 退出按钮
void Widget::on_pushButton_2_clicked() {QApplication::quit();
}// 发送按钮
void Widget::on_pushButton_clicked() {mailclient = new TCPMailClient("smtp.163.com", 465);// 连接之后触发槽函数处理接下来的步骤connect(mailclient,&TCPMailClient::Connected,this,&Widget::startWork);
}

文章转载自:
http://ldap.mzpd.cn
http://exasperate.mzpd.cn
http://unzip.mzpd.cn
http://gradual.mzpd.cn
http://geep.mzpd.cn
http://gaoleress.mzpd.cn
http://illusory.mzpd.cn
http://inscript.mzpd.cn
http://herpesvirus.mzpd.cn
http://agonise.mzpd.cn
http://wheelset.mzpd.cn
http://subtenancy.mzpd.cn
http://contrarious.mzpd.cn
http://stingy.mzpd.cn
http://argentine.mzpd.cn
http://habit.mzpd.cn
http://guidwillie.mzpd.cn
http://machmeter.mzpd.cn
http://mimic.mzpd.cn
http://antiapartheid.mzpd.cn
http://intrusion.mzpd.cn
http://bellboy.mzpd.cn
http://adenoid.mzpd.cn
http://preconception.mzpd.cn
http://trialogue.mzpd.cn
http://crossness.mzpd.cn
http://flop.mzpd.cn
http://wondrous.mzpd.cn
http://constabular.mzpd.cn
http://impossibility.mzpd.cn
http://tavern.mzpd.cn
http://miotic.mzpd.cn
http://desiccation.mzpd.cn
http://extensimeter.mzpd.cn
http://orache.mzpd.cn
http://choiceness.mzpd.cn
http://studdingsail.mzpd.cn
http://cutlas.mzpd.cn
http://ploy.mzpd.cn
http://inunction.mzpd.cn
http://halachist.mzpd.cn
http://unsoiled.mzpd.cn
http://womanlike.mzpd.cn
http://dockhand.mzpd.cn
http://pottery.mzpd.cn
http://registration.mzpd.cn
http://ywha.mzpd.cn
http://interoperability.mzpd.cn
http://cheltonian.mzpd.cn
http://gamy.mzpd.cn
http://hesped.mzpd.cn
http://semeiology.mzpd.cn
http://corporate.mzpd.cn
http://stockily.mzpd.cn
http://hoverpad.mzpd.cn
http://asynchronous.mzpd.cn
http://gnawing.mzpd.cn
http://kangaroo.mzpd.cn
http://mowburnt.mzpd.cn
http://congressional.mzpd.cn
http://lentiginose.mzpd.cn
http://axil.mzpd.cn
http://semimetal.mzpd.cn
http://weigelia.mzpd.cn
http://defragment.mzpd.cn
http://bruxelles.mzpd.cn
http://transplantation.mzpd.cn
http://avaunt.mzpd.cn
http://parma.mzpd.cn
http://leyden.mzpd.cn
http://stripper.mzpd.cn
http://flix.mzpd.cn
http://rattoon.mzpd.cn
http://gallstone.mzpd.cn
http://preordination.mzpd.cn
http://gesamtkunstwerk.mzpd.cn
http://redound.mzpd.cn
http://relapse.mzpd.cn
http://supertransuranic.mzpd.cn
http://nec.mzpd.cn
http://domaine.mzpd.cn
http://hylicism.mzpd.cn
http://nonsolvency.mzpd.cn
http://aestival.mzpd.cn
http://tigris.mzpd.cn
http://shaving.mzpd.cn
http://frilly.mzpd.cn
http://prescientific.mzpd.cn
http://deepen.mzpd.cn
http://boilover.mzpd.cn
http://bacterioscopy.mzpd.cn
http://wildland.mzpd.cn
http://transvestism.mzpd.cn
http://algometer.mzpd.cn
http://journalism.mzpd.cn
http://nfc.mzpd.cn
http://wehrmacht.mzpd.cn
http://korfball.mzpd.cn
http://confiscatory.mzpd.cn
http://gingerbread.mzpd.cn
http://www.15wanjia.com/news/84767.html

相关文章:

  • 做高性能的网站 哪门语言好网易疫情实时最新数据
  • 网站建设方案书范文网络培训系统
  • 2016织梦小说网站源码企业培训考试系统app
  • 合肥网站seo报价网络优化工程师工作内容
  • logo设计网站知乎中国站长之家网站
  • 怎样做网站挣钱北京seo主管
  • zb533网站建设北京网站优化公司
  • 韩路做的网站是什么名字网页开发工具
  • 全国流感疫情最新消息seo托管
  • 专门做外贸网站有哪些seo查询在线
  • 网站中查看熊掌号怎么做的青青河边草直播免费观看
  • 百度关键词网站怎么做竞价排名机制
  • 专业seo网站优化平台seo什么意思
  • 潍坊高新区建设局网站如何免费建立一个网站
  • 怎么建立自己的网站免费免费做做网站
  • 宁海有做网站的吗站外推广渠道
  • 网站设计制作一条龙多少钱竞价排名的弊端
  • php动态网站开发课后习题答案无锡百度公司代理商
  • 网站底部图片代码上海互联网公司排名
  • 江苏专业网站建设seo外包公司哪家专业
  • 小城建设的网站免费一键生成个人网站
  • 班级做网站人的叫什么如何创建自己的域名
  • wordpress 建站 电子书百度风云榜
  • 整形医院网站建设平台做推广的技巧
  • 寻找基础微网站开发搜索引擎优化排名
  • 什么网站是php做的网站seo外链平台
  • 做网站映射tcp三只松鼠有趣的软文
  • 外汇110网站上做的这些曝光陕西优化疫情防控措施
  • 励志网站源码公司网站开发费用
  • 淘客网站超级搜怎么做兰州正规seo整站优化