Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: JIesnik от Август 20, 2010, 17:52



Название: Программа в программе?
Отправлено: JIesnik от Август 20, 2010, 17:52
В некоторых программах (не на Qt), видел, что одно приложение запускается внутри другого. Т.е. создаётся виджет и внутрь него загружается сторонняя программа (например, Опера). Мне требуется изобразить нечто подобное, но на Qt. Гуглил, ничего не нашёл. Есть ли варианты?
P.S.: если вопрос глупый или не туда - сильно не пинайте.


Название: Re: Программа в программе?
Отправлено: crossly от Август 20, 2010, 18:01
не уверен.... но возможно вам в сторону OLE...


Название: Re: Программа в программе?
Отправлено: SASA от Август 20, 2010, 18:12
Цитировать
В некоторых программах (не на Qt), видел, что одно приложение запускается внутри другого.
Я тоже видел такое приложение, WMVare назывется ;D


Название: Re: Программа в программе?
Отправлено: JIesnik от Август 20, 2010, 18:15
Да, нет. Раньше мы писали клиент для нашего сайта на NeoBook (убогий редактор, компилирует под дельфи), так вот туда удавалось вклеить оперу. Так же видел подобные игры. Например, движок S.T.A.L.K.E.R. Online позволяет запускать другие приложения внутри игры, вот так-то. К тому же, Flash ведь тоже как-то встраивается в движок


Название: Re: Программа в программе?
Отправлено: Пантер от Август 20, 2010, 18:46
ActiveQt


Название: Re: Программа в программе?
Отправлено: JIesnik от Август 20, 2010, 18:47
Спасибо, я вроде начал разбираться, но если ActiveQt - значит ActiveX, а значит - только Windows. Так?


Название: Re: Программа в программе?
Отправлено: Пантер от Август 20, 2010, 18:57
Угу. Для Линуха нужно что-то другое искать.


Название: Re: Программа в программе?
Отправлено: JIesnik от Август 20, 2010, 19:08
ActiveQt
А вы мне не поможете? Никак не могу разобраться. Хотя бы прмиерчик запуска любой внешней программы (кроме ворда и экселя)


Название: Re: Программа в программе?
Отправлено: Авварон от Август 20, 2010, 19:17
Я тоже видел такое приложение, WMVare назывется ;D
Parallels вроде Qt юзают))


Название: Re: Программа в программе?
Отправлено: JIesnik от Август 20, 2010, 21:43
Почитав я понял, что ActivX - не вариант, в Необуке что-то другое


Название: Re: Программа в программе?
Отправлено: crossly от Август 20, 2010, 23:38
для Х11 http://doc.trolltech.com/4.7-snapshot/qx11embedcontainer.html (http://doc.trolltech.com/4.7-snapshot/qx11embedcontainer.html) думаю вариант....


Название: Re: Программа в программе?
Отправлено: JIesnik от Август 21, 2010, 11:29
2crossly, не знаю, что-то не появляется =(
Вот код:
Код
C++ (Qt)
   void openbrowser()
   {
       QMdiArea* mdiarea = createmdiarea();
       QMainWindow* browserwgt = new QMainWindow(this);
 
       QX11EmbedContainer browsercont;
       browsercont.show();
       browsercont.setParent(browserwgt);
       QProcess *browserpr = new QProcess(&browsercont);
 
       browserpr->start("./gedit"); // esli budet rabotat, to gedit zamenu brauzerom Arora
 
       setCentralWidget(mdiarea);
       mdiarea->addSubWindow(browserwgt);
 
   }

когда нажимаю кнопку, которой должен запустить gedit, отладчик вываливает ошибку:
Код
Bash
QProcess: Destroyed while process is still running.
и открывается пустое MDI-окошко. Как быть?


Название: Re: Программа в программе?
Отправлено: BRE от Август 21, 2010, 11:34
Вот объясни, почему большинство объектов ты создаешь в хипе (используя new), а объект класса QX11EmbedContainer - на стеке?
Как ты думаешь, какая разница в этих методах создания объектов?


Название: Re: Программа в программе?
Отправлено: JIesnik от Август 21, 2010, 12:01
Не знаю, честно. Я не учил язык.  :-[


Название: Re: Программа в программе?
Отправлено: JIesnik от Август 21, 2010, 12:11
QX11EmbedContainer сделал в хипе, получилось так:
Код
C++ (Qt)
   void openbrowser()
   {
       QMdiArea* mdiarea = createmdiarea();
       QMainWindow* browserwgt = new QMainWindow(this);
 
       QX11EmbedContainer *browsercont = new QX11EmbedContainer(browserwgt);
       browsercont->show();
 
       QProcess *browserpr = new QProcess;
       browserpr->setParent(browsercont);
 
 
       browserpr->start("./gedit");
       browserwgt->setCentralWidget(browsercont);
       setCentralWidget(mdiarea);
       mdiarea->addSubWindow(browserwgt);
 
   }

теперь gedit запускается рядом, или я, тупой, опять что-то не так сделал?


Название: Re: Программа в программе?
Отправлено: BRE от Август 21, 2010, 12:40
Посмотри на:
http://doc.trolltech.com/4.7-snapshot/qx11embedcontainer.html
http://doc.trolltech.com/4.7-snapshot/qx11embedwidget.html
и на саму спецификацию:
http://standards.freedesktop.org/xembed-spec/xembed-spec-0.5.html


Название: Re: Программа в программе?
Отправлено: mcrads от Август 23, 2010, 23:48
может быть попробовать что-то вроде
Код:
QProcess *p = new QProcess(browsercont);
p->start("./gedit");
browsercont->embedClient(p->pid());

однако не знаю, сработает ли, нет возможности проверить. просто не знаю, можно ли ИД процесса преобразовать к ИД окна. если нет - я думаю стоит обратиться к платформозависимой реализации для получения ИД окна. тогда соверенно спокойно сможешь его назначить контейнеру.


Название: Re: Программа в программе?
Отправлено: Nimbus от Август 24, 2010, 14:28
Можно также покопать в сторону OLE-сервера.


Название: Re: Программа в программе?
Отправлено: JIesnik от Август 24, 2010, 21:51
2Sickfar, не получается :( Жаль, а вы не знаете как получить id окна?
Мне на otvety.google.ru ответили (http://otvety.google.ru/otvety/thread?tid=74e55d1fbd86e565&table=%2Fotvety%2Fuser%3Fuserid%3D16881856381900166785%26tab%3Dwtmtoa), но я ничего не понимаю, растолкуйте мне, дураку


Название: Re: Программа в программе?
Отправлено: JIesnik от Август 24, 2010, 21:52
2JC, копали - не вариант  :-[


Название: Re: Программа в программе?
Отправлено: andrew.k от Октябрь 28, 2010, 15:59
2Sickfar, не получается :( Жаль, а вы не знаете как получить id окна?
Мне на otvety.google.ru ответили (http://otvety.google.ru/otvety/thread?tid=74e55d1fbd86e565&table=%2Fotvety%2Fuser%3Fuserid%3D16881856381900166785%26tab%3Dwtmtoa), но я ничего не понимаю, растолкуйте мне, дураку

Получить ид окна winId()

Чтобы встроить виджет в контейнер, нужно чтобы этот виджет был QX11EmbedWidget или наследником.
Дальше либо передаешь контейнеру ид виджета, либо виджету ид контейнера и вызываешь соответствующую функцию встраивания.
Встроить оперу (или что там у тебя?) не получится, если она не поддерживает этот механизм.