Я пытаюсь заставить Qt запустить другую программу Qt при нажатии кнопки.
Вот мой код
void Widget::launchModule(){
QString program = "C:\A2Q1-build-desktop\debug\A2Q1.exe";
QStringList arguments;
QProcess *myProcess = new QProcess(this);
myProcess->start(program, arguments);
myProcess->waitForFinished();
QString strOut = myProcess->readAllStandardOutput();}
Так что предполагается сохранить в strOut QString. Во-первых, у меня ошибка в строке программы QString. Я не понимаю, как указать это на программу, так как все примеры QProcess, которые я рассмотрел, использовались / и для меня это не имеет смысла. Также с правильным синтаксисом строки программы это будет работать?
Спасибо
В строковом литерале C / C ++ вы должны экранировать все обратные слэши.
Это действительно плохо, чтобы использовать waitForX()
функции в Qt. Они блокируют ваш графический интерфейс и делают ваше приложение не отвечающим. С точки зрения пользовательского опыта, это действительно отстой. Не делай этого.
Вы должны кодировать в асинхронном стиле, с сигналами и слотами.
мой другой ответ предоставляет довольно полный пример того, как может работать асинхронное взаимодействие процессов. Оно использует QProcess
запустить себя.
Ваш оригинальный код может быть изменен следующим образом:
class Window : ... {
Q_OBJECT
Q_SLOT void launch() {
const QString program = "C:\\A2Q1-build-desktop\\debug\\A2Q1.exe";
QProcess *process = new QProcess(this);
connect(process, SIGNAL(finished(int)), SLOT(finished()));
connect(process, SIGNAL(error(QProcess::ProcessError)), SLOT(finished()));
process->start(program);
}
Q_SLOT void finished() {
QScopedPointer<Process> process = qobject_cast<QProcess*>(sender());
QString out = process->readAllStandardOutput();
// The string will be empty if the process failed to start
... /* process the process's output here */
// The scoped pointer will delete the process at the end
// of the current scope - right here.
}
...
}
Других решений пока нет …