1

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.

コンテナを見ることができません、提案?????? ありがとう

4

1 に答える 1

2

QProcessスタックに割り当てられ、範囲外になるとすぐに削除されます。これは、「xterm」子プロセスが終了する前に発生する可能性があります (したがって、出力)。

代わりに QProcess をヒープに割り当ててみてください。

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

QProcess は次の 3 つの方法で削除できます。

  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);
于 2008-12-21T05:04:48.693 に答える