Multithreading 在线程中连接QProcess QT5样式

Multithreading 在线程中连接QProcess QT5样式,multithreading,qt5,Multithreading,Qt5,我正在尝试编写一个压缩gui,它创建一个调用压缩工具的不同线程,并使用QProcess传递参数 当使用旧的信号/插槽方式连接时,信号会被抛来抛去,我可以对它们做出反应,但是尝试在没有信号/插槽的情况下连接它并不会得到任何回调 class CommandProcessorMT : public QObject { Q_OBJECT public: explicit CommandProcessorMT(QObject *parent = nullptr); bool cmd

我正在尝试编写一个压缩gui,它创建一个调用压缩工具的不同线程,并使用QProcess传递参数

当使用旧的信号/插槽方式连接时,信号会被抛来抛去,我可以对它们做出反应,但是尝试在没有信号/插槽的情况下连接它并不会得到任何回调

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();

}