#c #qt #qprocess
#c #qt #qprocess
Вопрос:
У меня есть две программы, каждая с QProcess, и у меня разное поведение в отношении ввода QProcess с акцентированными символами (точнее, я создаю Qprocess для выполнения copy
команды dos, и путь принимает акцент).
Средой выполнения и разработки является 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 необходим для большего количества вещей, но не только для копирования (например, для получения обратной связи и процента операций). Копия предназначена только для того, чтобы изолировать проблему. На самом деле я делаю гораздо больше вещей.
Комментарии:
1. Скорее всего, более крупный проект имеет разные настройки компилятора относительно того, как интерпретировать кодировку входного файла… Как создаются эти два проекта? Одинаковые / разные версии Qt? Тот же / другой компилятор / IDE?
2. Спасибо за ваш интерес. Та же версия QT, Visual Studio 2013
3. Вы уверены, что проблема в акценте? Будет ли это работать с другими путями в вашем большом проекте?
4. Конечно, я тестировал с любым путем, не содержащим акцента.
Ответ №1:
Я попытался воссоздать ваше поведение с помощью 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
Комментарии:
1. Отличное предложение, друг. Я не проверял некоторые из ваших подходов. Я проведу тест.