Multithreading 在线程中连接QProcess QT5样式
我正在尝试编写一个压缩gui,它创建一个调用压缩工具的不同线程,并使用QProcess传递参数 当使用旧的信号/插槽方式连接时,信号会被抛来抛去,我可以对它们做出反应,但是尝试在没有信号/插槽的情况下连接它并不会得到任何回调Multithreading 在线程中连接QProcess QT5样式,multithreading,qt5,Multithreading,Qt5,我正在尝试编写一个压缩gui,它创建一个调用压缩工具的不同线程,并使用QProcess传递参数 当使用旧的信号/插槽方式连接时,信号会被抛来抛去,我可以对它们做出反应,但是尝试在没有信号/插槽的情况下连接它并不会得到任何回调 class CommandProcessorMT : public QObject { Q_OBJECT public: explicit CommandProcessorMT(QObject *parent = nullptr); bool cmd
class CommandProcessorMT : public QObject
{
Q_OBJECT
public:
explicit CommandProcessorMT(QObject *parent = nullptr);
bool cmdProcess(QString tool,QStringList params);
...
private:
QProcess *m_CmdProcess;
...
private slots:
void processFinished(int exitCode, QProcess::ExitStatus exitStatus);
void processErrored(QProcess::ProcessError error);
};
void CommandProcessorMT::compressionLoop()
{
...
m_CmdProcess = new QProcess(this);
/* Connection works */
connect(m_CmdProcess, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(processFinished(int, QProcess::ExitStatus)));
connect(m_CmdProcess, SIGNAL(error(QProcess::ProcessError)), this, SLOT(processErrored(QProcess::ProcessError)));
/* Connection doesn't work */
connect(m_CmdProcess, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), this, &CommandProcessorMT::processFinished);
connect(m_CmdProcess, QOverload<QProcess::ProcessError>::of(&QProcess::error), this, &CommandProcessorMT::processErrored);
while(...)
{
/* Do stuff */
m_CmdProcess->start(tool,params);
m_CmdProcess->waitForFinished(-1);
}
emit compDone();
}
void CommandProcessorMT::processFinished(int exitCode, QProcess::ExitStatus exitStatus)
{
qDebug() << "process Finished";
}
void CommandProcessorMT::processErrored(QProcess::ProcessError error)
{
qDebug() << "Process Error";
}
不确定是否相关,但。。。您使用的是哪个版本的Qt?qt5.6中重命名了
QProcess::error
信号。使用5.13删除了错误过程,并开始处理所有仅完成的信号。现在通过QOverload连接时似乎可以工作。也许这一直就是问题所在?不管怎样,谢谢你:D
class BatchConverter : public QMainWindow
{
Q_OBJECT
public:
BatchConverter(QWidget *parent = nullptr);
~BatchConverter() override;
...
private:
Ui::BatchConverter *ui;
CommandProcessorMT *testi;
QThread *conversionThread;
...
};
BatchConverter::BatchConverter(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::BatchConverter)
{
testi = new CommandProcessorMT();
conversionThread = new QThread();
...
testi->moveToThread(conversionThread);
// Signals to own Slots
...
// Slots to own Signals
...
ui->setupUi(this);
setAcceptDrops(true);
ui->progressBar->reset();
conversionThread->start();
}