QX11EmbedContainer и проблема QProcess - PullRequest
1 голос
/ 20 декабря 2008

Я пытался вставить 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.

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

1 Ответ

2 голосов
/ 21 декабря 2008

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);
...