2016-01-22 2 views
-1

У меня есть простой QMainWindow, в котором пользователь может установить некоторые параметры. У меня есть три кнопки, которые при нажатии создают новый QProcess, отображающий QMainWindow. Например, кнопка главного окна A запускает QProcess A, кнопка главного окна B запускает процесс B и т. Д. Я хотел был бы иметь возможность взаимодействовать с главным окном, потому что теперь, когда я нажимаю кнопку, QProcess запускается правильно, отображая другой окно и т. д., но исходное основное окно остается замороженным до конца QProcess.QProcess начинается с окна QMainWindow freezes

Есть ли способ поддерживать оперативное реагирование на основное окно, чтобы можно было с ним взаимодействовать WHILE QProcess/QProcesses запускается/запускается?

EDIT: вот как я начинаю процессы:

QProcess process; 
process.execute("../../RRTStar/RRTStar", QStringList() << "--file" << "../../settings.conf"); 

где RRTStar это имя исполняемого файла и --file ../../settings.conf являются параметрами командной строки. Обратите внимание, что RRTStar состоит из MainWindow и выполняет тяжелые вычисления с использованием потоков.

+0

Покажите нам, как вы запускаете процессы? – Evgeny

+0

Qt имеет очень хорошие документы. Если ваш любимый редактор/IDE не поддерживает контекстно-зависимую справку с Qt-кодом, вы должны запустить Qt Creator сбоку, так что вы можете, например, в этом случае поместить курсор в имя метода 'execute()', нажать F1 , а затем прочитайте документацию, указанную в этом ответе ниже. – hyde

+0

Вы, похоже, не поняли мой вопрос. Мне не нужен способ взаимодействия с 'QProcess', который уже работает, поскольку новое окно процесса является отзывчивым. Проблема в том, что главное окно остается замороженным, пока оконный процесс не завершится и не закончится.Кажется, что нет способа решить эту проблему, все документы и вопросы связаны с QDialog/QMessageBox. – Michael

ответ

1

Информация из официальной документации:

int QProcess::execute(const QString & program, const QStringList & arguments) 

Запускает программу программы с аргументами аргументы в новом процессе ждет его завершения

Если вы хотите сделать асинхронный неблокирующий вызов, вам необходимо использовать QProcess::start():

void QProcess::start(const QString & program, const QStringList & arguments, OpenMode mode = ReadWrite) 

Об взаимодействия с процессом: он inherites QIODevice, так

QProcess позволяет рассматривать процесс как последовательное устройство ввода/вывода. Вы можете написать и читать из процесса так же, как вы получили бы доступ к сетевому подключению с использованием QTcpSocket. Затем вы можете записать на стандартный вход , позвонив по номеру write() и прочитав стандартный вывод , позвонив по номеру read(), readLine() и getChar(). Потому что наследует QIODevice ...

process.write("Qt rocks!"); 
//... 
QByteArray result = process.readAll(); 
+0

Я уже пробовал это, прежде чем задавать вопрос. 'QProcess :: start()' правильно запускает процесс и, поскольку для завершения требуется много времени, он немедленно завершает его, не дожидаясь завершения. Я добавил 'waitForFinished()', но, конечно, это не работает, так как 1) я не знаю, сколько потребуется, чтобы закончить, и 2) он снова замораживает главное окно. Итак, любые предложения? – Michael

+0

Общайтесь с процессом write() и read() –

+0

Я не хочу общаться с процессом. Я хочу, чтобы он свободно работал столько, сколько потребуется, и я также хочу, чтобы главное окно было отзывчивым. – Michael