встраивание приложения (в данном случае терминала) в приложение QT - PullRequest
6 голосов
/ 20 ноября 2008

Я пишу приложение QT, и мне нужно встроить терминал (скажем, xterm) в QDialog, как некоторые приложения KDE (см. Kdevelop / kate /...).

Я пытался с: - QX11EmbedContainer помещен в QLayout моего QDialog - QProcess для программы, которую я хочу выполнить

Я ожидаю, что QProcess работает внутри QX11EmbedContainer, но он не работает.

Проблема в том, что я не могу поместить xterm в QX11EmbedContainer, я получаю только окно xterm (к сожалению, отделенное от моего QDialog). У кого-нибудь есть такая же проблема?

Ответы [ 2 ]

3 голосов
/ 22 ноября 2008

Извините, я пробовал ваше решение перед публикацией этого сайта, и оно не работает. Я решил перейти на kdelibs и использовать этот импорт и этот код

#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() );
0 голосов
/ 21 ноября 2008

Вам необходимо передать идентификатор окна контейнера в xterm.

Если вы посмотрите пример в справке Qt для QX11EmbedContainer, он просто передает идентификатор окна в QProcess. Измените это на

 QProcess process(&container);
 QString executable(app.arguments()[1]);
 QStringList arguments;
 arguments << "-into" << QString::number(container.winId());
 process.start(executable, arguments);

где "-into" был добавлен к аргументам. Со страницы руководства XTerm:

- в windowId

Учитывая идентификатор окна X (десятичное целое число), xterm перекрасит свою оболочку верхнего уровня виджет для этого окна. Это используется встроить xterm в другие приложения.

...