Qprocess:未收到运行Powershell脚本的done()信号



我正在开发一个Qt应用程序,该应用程序除其他外,将Excel电子表格转换为用选项卡文件分隔的文本。这是通过运行Windows Powershell脚本来完成的。
我的问题是,尽管转换成功完成,但来自 QProcess 的 done() 信号永远不会发出。是的,我收到状态更改()信号。

Powershell 脚本 (ps_excel.ps1)

(改编自这个问题)

param ([string]$ent = $null, [string]$sal = $null)
$xlCSV = -4158  #value for tab delimited file
$Excel = New-Object -Com Excel.Application 
$Excel.visible = $False 
$Excel.displayalerts=$False
$b = $Excel.Workbooks.Open($ent) 
$b.SaveAs($sal,$xlCSV) 
$Excel.quit()
exit 0 #tested without exit, with exit and with exit 0

Qt应用头

(对于测试,最小情况是没有其他小部件的QDialog。

#ifndef DIALOG_H
#define DIALOG_H
#include <QDialog>
#include <QProcess>
#include <QDebug>
namespace Ui {
class Dialog;
}
class Dialog : public QDialog
{
    Q_OBJECT
    public:
    explicit Dialog(QWidget *parent = 0);
    ~Dialog();
    QProcess *proces;
    private:
        Ui::Dialog *ui;
    private slots:
        void procFinish(int estat);
        void procState(QProcess::ProcessState estat);
};
#endif // DIALOG_H

Qt应用程序C++

#include "dialog.h"
#include "ui_dialog.h"
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
    ui->setupUi(this);
    QString program = "C:/Windows/System32/WindowsPowerShell/v1.0/powershell.exe";
    QStringList params;
    params << "-File" << "C:/Garsineu/ps_excel.ps1" << "-ent" << "C:/Garsineu/PROVAGALATEA.xls" << "-sal" << "C:/Garsineu/PROVAGALATEA.tab";
    proces = new QProcess();
    connect(proces, SIGNAL(finished(int)), this, SLOT(procFinish(int)));
    connect(proces, SIGNAL(stateChanged(QProcess::ProcessState)), this, SLOT(procState(QProcess::ProcessState)));
    proces->start(program, params);
}
Dialog::~Dialog()
{
    delete ui;
}
void Dialog::procFinish(int estat)
{
    qDebug() << "Finished";
}
void Dialog::procState(QProcess::ProcessState estat)
{
    qDebug() << estat;
}

尽管转换成功并显示状态 1(已启动)和 2(正在运行),但永远不会显示消息"已完成"。
我还尝试通过 waitForDone () 方法同步执行此操作,该方法总是超时。

环境

  • 视窗 7 专业版 64 位
  • Powershell v1.0 x86
  • Qt 5.4.0 带minGW491_32

我感谢您的帮助。谢谢。

我找到了解决方案。显然,Powershell 在控制台或从另一个程序(非交互式)调用时以不同的方式运行。如果我在 ps_excel.ps1 脚本的末尾添加:

Get-Process Powershell | Stop-Process

而不是

exit 0

停止了真正的Powershell并获得完成的信号,QProcess::ExitStatus = 0。

相关内容

  • 没有找到相关文章

最新更新