Проблема QX11EmbedContainer и QProcess

Я пытался поместить QX11EmbedContainer в свое приложение, и мне нужно запустить в нем терминал (потому что с konsolepart я практически ничего не могу сделать).

QX11EmbedContainer* container = new QX11EmbedContainer(this); // with or without "this" I got the same result
container->show(); 
QProcess process(container);
QString executable("xterm -into ");
QStringList arguments;
arguments << QString::number(container->winId());
process.start(executable, arguments);

компиляция идет нормально, но я получил это сообщение:

QProcess: Destroyed while process is still running.

и я не могу увидеть контейнер, предложения?????? Спасибо


person Giancarlo    schedule 20.12.2008    source источник


Ответы (1)


QProcess размещается в стеке и удаляется, как только выходит за пределы области видимости. Вероятно, это произойдет до завершения дочернего процесса "xterm" (отсюда вывод).

Вместо этого попробуйте выделить QProcess в куче:

QProcess * process = new QProcess(container);
...
process->start(executable, arguments);

Вы можете удалить QProcess тремя способами:

  1. Ничего не делать. Пусть QX11EmbedContainer удалит его. Это дочерний элемент QX11EmbedContainer, и он будет удален при удалении QX11EmbedContainer.

  2. Подключите сигнал finished() к его собственному слоту deleteLater().

    connect( process, SIGNAL(finished(int,QProcess::ExitStatus)), process, SLOT(deleteLater()) );

  3. Удалите его самостоятельно, сохранив указатель на него и удалив этот указатель позже.

В качестве дополнительного примечания, я с подозрением отношусь к первому параметру QProcess::start(). Это должен быть путь к вашему исполняемому файлу, и дополнительные аргументы должны быть добавлены в файл QStringlist.

QProcess * process = new QProcess(container);
QString executable("xterm"); // perhaps try "/usr/X11/bin/xterm"
QStringList arguments;
arguments << "-into";
arguments << QString::number(container->winId());
proces->start(executable, arguments);
person Michael Bishop    schedule 21.12.2008