incrustar una aplicación (en este caso, un terminal) dentro de una aplicación QT
Pregunta
Estoy escribiendo una aplicación QT y necesito incrustar un terminal (digamos, xterm) dentro de un QDialog, como alguna aplicación KDE (ver kdevelop / kate / ...).
He estado intentando con: - QX11EmbedContainer colocado en el QLayout de mi QDialog - QProcess para el programa que quiero ejecutar
Espero que el QProcess se ejecute dentro del QX11EmbedContainer, pero no funciona.
El problema es que no puedo poner el xterm en el QX11EmbedContainer, lo único que obtengo es una ventana xterm (desafortunadamente separada de mi QDialog). ¿Alguien tiene el mismo problema?
Solución
Lo siento, he probado tu solución antes de publicar este sitio y no funciona. He resuelto cambiar a kdelibs y usar esas importaciones y este código
#include <kparts/part.h>
#include <assert.h>
#include <kde_terminal_interface.h>
#include <kpluginfactory.h>
#include <klibloader.h>
KLibFactory* factory = KLibLoader::self()->factory( "libkonsolepart" );
KParts::Part* p = static_cast<KParts::Part*>(factory->create( this,"tralala",
QStringList() << "dio") );
assert(p);
setCentralWidget( p->widget() );
TerminalInterface *t = qobject_cast<TerminalInterface*>(p);
t->showShellInDir( QDir::home().path() );
Otros consejos
Debe pasar la ID de la ventana del contenedor a xterm.
Si mira el ejemplo en la ayuda de Qt para QX11EmbedContainer, simplemente pasa la identificación de la ventana al QProcess. Cambia esto a
QProcess process(&container);
QString executable(app.arguments()[1]);
QStringList arguments;
arguments << "-into" << QString::number(container.winId());
process.start(executable, arguments);
donde " -into " ha sido agregado a los argumentos. Desde la página de manual de XTerm:
-into windowId
Dado un identificador de ventana X (un entero decimal), xterm reparent su caparazón de nivel superior widget a esa ventana. Esto es usado para incrustar xterm en otras aplicaciones.