QT 狡猾与邮件客户端
QT Cuncurrent With mail Client
嗨,我已经在这里问了我的问题并理解了为什么它不起作用,现在我已经通过将 Smptp 对象作为类变量来修改源代码,但仍然不起作用。
我需要实现的是从我选择QtConcurrent::run()
执行此操作的线程发送邮件,但在单击发送按钮后未调用插槽。
主窗口.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "QSettings"
#include "QFuture"
#include "QtConcurrent/QtConcurrent"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
connect(ui->sendBtn, SIGNAL(clicked()),this, SLOT(test()));
connect(ui->exitBtn, SIGNAL(clicked()),this, SLOT(close()));
connect(ui->browseBtn, SIGNAL(clicked()), this, SLOT(browse()));
}
void MainWindow::browse()
{
files.clear();
QFileDialog dialog(this);
dialog.setDirectory(QDir::homePath());
dialog.setFileMode(QFileDialog::ExistingFiles);
if (dialog.exec())
files = dialog.selectedFiles();
QString fileListString;
foreach(QString file, files)
fileListString.append( """ + QFileInfo(file).fileName() + "" " );
ui->file->setText( fileListString );
}
void MainWindow::test(){
QFuture<void> f4 = QtConcurrent::run(this,&MainWindow::sendMail); // this not work
//sendMail(); // this works
}
void MainWindow::sendMail()
{
smtp = new Smtp(ui->uname->text(), ui->paswd->text(), ui->server->text(), ui->port->text().toInt());
connect(smtp, SIGNAL(status(QString)), this, SLOT(mailSent(QString)));
if( !files.isEmpty() )
smtp->sendMail(ui->uname->text(), ui->rcpt->text() , ui->subject->text(),ui->msg->toPlainText(), files );
else
smtp->sendMail(ui->uname->text(), ui->rcpt->text() , ui->subject->text(),ui->msg->toPlainText());
}
void MainWindow::mailSent(QString status)
{
if(status == "Message sent")
QMessageBox::warning( 0, tr( "Qt Simple SMTP client" ), tr( "Message sent!nn" ) );
delete smtp;
}
MainWindow::~MainWindow()
{
delete ui;
}
主窗口.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include "smtp.h"
#include <QtWidgets/QMessageBox>
#include <QFileDialog>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
void sendMail();
void mailSent(QString);
void browse();
void test();
private:
Ui::MainWindow *ui;
QStringList files;
Smtp* smtp ;
};
#endif // MAINWINDOW_H
如果我直接调用sendMail();
它可以工作,但使用QFuture<void> f4 = QtConcurrent::run(this,&MainWindow::sendMail);
它不起作用,不工作意味着插槽没有被调用,我该如何解决这个问题?
我从这里引用代码 https://github.com/xcoder123/SimpleSmtp_SSL_QT5/tree/master/smtp_attachements
谢谢哈里斯
我已经在这里提到的解决方案是使用 QThread
而不是 QtConcurrent::run
.Qt文档中包含一个详细的例子:http://doc.qt.io/qt-5/qthread.html#details
以下代码使此示例适应您的用例。 smtp
被移动到workerThread
。主线程和workerThread
之间的通信是使用信号和插槽完成的。请注意,您不能再在Smtp
中调用任何与GUI相关的函数(例如显示消息框等(!这必须在主线程中完成。
用户名、密码等可能也应该通过信号传递给Smtp::sendMail
。
主窗口.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QtWidgets/QMessageBox>
#include <QFileDialog>
#include <QThread>
namespace Ui {
class MainWindow;
}
class Smtp;
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
void sendMailButtonClicked();
void mailSent(QString);
void browse();
private:
Ui::MainWindow *ui;
QStringList files;
Smtp* smtp;
QThread workerThread;
signals:
void sendMail(const QString &from, const QString &to, const QString &subject, const QString &body, QStringList files);
};
#endif // MAINWINDOW_H
主窗口.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "smtp.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
connect(ui->sendBtn, SIGNAL(clicked()),this, SLOT(sendMailButtonClicked()));
connect(ui->exitBtn, SIGNAL(clicked()),this, SLOT(close()));
connect(ui->browseBtn, SIGNAL(clicked()), this, SLOT(browse()));
smtp = new Smtp(ui->uname->text(), ui->paswd->text(), ui->server->text(), ui->port->text().toInt());
smtp->moveToThread(&workerThread);
connect(this, SIGNAL(sendMail(QString,QString,QString,QString,QStringList)), smtp, SLOT(sendMail(QString,QString,QString,QString,QStringList)));
connect(smtp, SIGNAL(status(QString)), this, SLOT(mailSent(QString)));
workerThread.start();
}
void MainWindow::browse()
{
files.clear();
QFileDialog dialog(this);
dialog.setDirectory(QDir::homePath());
dialog.setFileMode(QFileDialog::ExistingFiles);
if (dialog.exec())
files = dialog.selectedFiles();
QString fileListString;
foreach(QString file, files)
fileListString.append( """ + QFileInfo(file).fileName() + "" " );
ui->file->setText( fileListString );
}
void MainWindow::mailSent(QString status)
{
if(status == "Message sent")
QMessageBox::warning( 0, tr( "Qt Simple SMTP client" ), tr( "Message sent!nn" ) );
}
MainWindow::~MainWindow()
{
workerThread.quit();
workerThread.wait();
delete ui;
}
void MainWindow::sendMailButtonClicked()
{
emit sendMail(ui->uname->text(), ui->rcpt->text() , ui->subject->text(),ui->msg->toPlainText(), files );
}
在 smtp.h 中:将sendMail
设置为插槽:
public slots:
void sendMail( const QString &from, const QString &to,
const QString &subject, const QString &body,
QStringList files = QStringList());
相关文章:
- Qt:使用'mailto:'打开用户的电子邮件客户端失败
- Qt TCP服务器不从客户端读取数据
- Qt WebSockets,如何向客户端发送消息
- 仅当在客户端部署时,QT 5.9的SSL握手问题
- 通过QT WebSocket将OpenCV Mat Image发送到HTML客户端
- 如何在客户端连接时在QT中更新QGraphicsView
- Qt TCP客户端无法显示收到的图像
- 如何在Qt中使UDP"客户端",以便他从服务器接收数据?
- Qt C++ 带有 Python 客户端的 SSL/TLS 服务器
- QT REST客户端为Microsoft认知服务翻译器API获得身份验证令牌
- 从QT Web服务器处理多个客户端
- 必须在客户端计算机上安装的内容才能运行QT快速应用程序
- Qt,客户端-服务器关系
- 使用qt的多客户端/服务器TCP应用程序
- 如何在Qt客户端应用程序中显示我的OSM磁贴
- 编译基于 sCrypt 的加密货币 QT 客户端时,抛出常见错误
- 服务器客户端程序上的QT-QFileSystemModel
- 使用Echo客户端示例从Qt UI连接到WebSocket服务器
- 用于Kaazing Gateway的qt C++WebSocket聊天客户端
- Qt 5: 如何制作"pure c++"客户端套接字?