问题描述
我有两个程序,每个程序都带有 QProcess 并且我对带有重音字符的 QProcess 输入有不同的行为
(更准确地说,我创建了一个 Qprocess 来执行 dos copy
命令并且路径采用重音)。
执行和开发环境为 Windows 10。
第一个程序是一个简单的原型,我用来测试我的代码是否可以正常工作。
这是我拥有的原型代码,其中的副本可以正常工作,并集成在一个简单的 main()
函数中。
该代码应该将名为 sfx.exe
的文件复制到带有重音 F:\path_accentué
的路径中,并且确实正确地进行了复制。
#include <QCoreApplication>
#include <Qdebug>
#include <QObject>
#include <QProcess>
int main(int argc,char *argv[])
{
QCoreApplication app(argc,argv);
QProcess* processus = new QProcess();
QStringList args;
QString path("F:\\path_accentué");
args << "/C" << "copy" << "E:\\test\\sfx.exe" << path;
processus->start("cmd.exe",args);
if (!processus->waitForStarted())
{
qDebug() << "Could not launch the process";
}
//processus->write(s.c_str());
if (!processus->waitForFinished(-1))
{
qDebug() << "Finished";
}
delete processus;
return app.exec();
}
但是,当我在更大的代码项目中集成(字面上复制和粘贴而不更改)这个原型时,我的 QProcess
实例无法识别 accentuated
路径,好像不再支持重音.
这是我在更大的项目中复制/粘贴的部分,现在我通过在 QT 中单击按钮来执行。
而这一次,QProcess 无法识别强调的路径(而是创建了一个名为 path_accentu�
的文件)
QProcess* processus = new QProcess();
QStringList args;
QString path("F:\\path_accentué");
args << "/C" << "copy" << "E:\\test\\sfx.exe" << path; processus->start("cmd.exe",args);
if (!processus->waitForStarted())
{
qDebug() << "Could not launch the process";
}
//processus->write(s.c_str());
if (!processus->waitForFinished(-1))
{
qDebug() << "Finished";
}
我在文档中没有找到强制 QProcess
识别强调输入的方法。
我想了解为什么 QProcess 实例在集成到我更大的项目中时表现不同。
什么可能会影响 QProcess 的行为并导致它在第二种情况下对输入进行不同的处理?
注意: QProcess 需要用于更多的事情,但不仅限于副本(例如获取反馈和操作百分比)。副本只是为了隔离问题。实际上,我做了更多的事情。
解决方法
我尝试使用 Qt 5.15 重新创建您的行为,并且可以创建带有重音符号的文件
start("cmd",{args...})
start("cmd /c args...")
-
setNativeArguments("/c args...")
+start("cmd")
最后一个推荐用于“cmd”调用,请看这里的备注:
https://doc.qt.io/qt-5/qprocess.html#start
唯一没用的,因为它死锁了
-
setArguments({args...})
+start("cmd")
此处演示:
https://gist.github.com/elsamuko/59f110cf3a678beae9db27860f6305c9