gpt4 book ai didi

c++ - QT Future Watcher 带邮件客户端

转载 作者:行者123 更新时间:2023-11-28 06:11:57 26 4
gpt4 key购买 nike

您好,我正在使用此处的代码 https://github.com/xcoder123/SimpleSmtp_SSL_QT5/tree/master/smtp_attachements从我的 qt 应用程序发送邮件并且它工作正常,但是当我使用 future wacht 在另一个线程中运行邮件发件人时它不起作用

QFuture<void> f4 = QtConcurrent::run(this,&MainWindow::sendMail); // this doesnot work
//sendMail(); //this work

这是mainWindow.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);
//sendMail();
}



void MainWindow::sendMail()
{
Smtp* 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!\n\n" ) );
}

MainWindow::~MainWindow()
{
delete ui;
}

和mainWindow.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;

};

#endif // MAINWINDOW_H

smtp类如图所示,我什么都没碰

https://github.com/xcoder123/SimpleSmtp_SSL_QT5/blob/master/smtp_attachements/smtp.h https://github.com/xcoder123/SimpleSmtp_SSL_QT5/blob/master/smtp_attachements/smtp.cpp

任何人都知道为什么在使用 future watcher 的线程中运行时它不起作用。

谢谢哈里斯

最佳答案

问题是 QtConcurrent::run 只是在一个单独的线程中运行一个函数,在您的例子中是 sendMail。一旦此函数返回,线程不再处于事件状态Smtp 中的槽将不会被调用。

要么将函数 sendMail 更改为 not 在邮件发送之前返回,要么使用 QThread并使用 QObject::moveToThreadSmtp* stmp 移动到它。

关于c++ - QT Future Watcher 带邮件客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31087596/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com