QProcess:未收到 finished() 信号 运行 Powershell 脚本
QProcess: not receiving finished() signal running Powershell script
我正在开发一个 Qt 应用程序,除其他外,它可以将 Excel 电子表格转换为用制表符文件分隔的文本。这是通过 运行 一个 Windows Powershell 脚本完成的。
我的问题是 QProcess 的 finished() 信号永远不会发出,尽管转换已成功完成。是的,我收到了 stateChanged() 信号。
Powershell 脚本 (ps_excel.ps1)
(改编自 this question)
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(运行),但从未显示消息 "Finished"。
我还尝试通过 waitForFinished() 方法同步进行,该方法总是超时。
环境
- Windows 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。
我正在开发一个 Qt 应用程序,除其他外,它可以将 Excel 电子表格转换为用制表符文件分隔的文本。这是通过 运行 一个 Windows Powershell 脚本完成的。
我的问题是 QProcess 的 finished() 信号永远不会发出,尽管转换已成功完成。是的,我收到了 stateChanged() 信号。
Powershell 脚本 (ps_excel.ps1)
(改编自 this question)
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(运行),但从未显示消息 "Finished"。
我还尝试通过 waitForFinished() 方法同步进行,该方法总是超时。
环境
- Windows 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。