Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Firefox от Апрель 07, 2014, 15:43



Название: вписать окно другого приложения в QWidget
Отправлено: Firefox от Апрель 07, 2014, 15:43
Здравствуйте. Хочу спросить совета. У меня есть программа у которой будет форма. я хочу нанести на форму область, ну скажем QFrame или QWidget (не знаю какой элемент для данной цели подойдет лучше) и, чтобы при запуске из моей программы другого приложения окно того приложения встраивалось в этот QFrame или QWidget. Получить id окна я могу функцией findWindow(), так как знаю название окна запускаемой программы(единственное хотелось бы не winApi использовать), а вот далее какими функциями можно реализовать нужную мне весчь?


Название: Re: вписать окно другого приложения в QWidget
Отправлено: Swa от Апрель 08, 2014, 08:02
В Qt такой возможности нет.
Единственный вариант - через Winapi, найти id окна, установить для него размер и положение такое, какое нужно и перехватывать его события на перемещение и изменение размера.


Название: Re: вписать окно другого приложения в QWidget
Отправлено: Firefox от Апрель 08, 2014, 11:14
это я знаю но мне не подходит потому как одна программа будет всегда не активной в таком случае.
вот наткнулась вот на это но пока не знаю с какой стороны к нему подойти  QWidget::createWindowContainer();


Название: Re: вписать окно другого приложения в QWidget
Отправлено: Firefox от Апрель 16, 2014, 13:31
в общем проблема свелась к тому что надо у второго окна приложения сделать родителем первое приложение.


Название: Re: вписать окно другого приложения в QWidget
Отправлено: Bepec от Апрель 16, 2014, 13:52
Гы :) Свелась в смысле - сам придумал, но ещё не реализовал?


Название: Re: вписать окно другого приложения в QWidget
Отправлено: Firefox от Апрель 16, 2014, 13:55
в смысле почитала, что вписывать никуда ничего не надо.
вот не пойму почему не работает 
Код:
void Widget::showAllHiddenTopLevelWidgets()
{
    int count=0;
    foreach (QWidget *widget, QApplication::topLevelWidgets())
    {
        if (widget->isWindow())
           count++;
    }
    qDebug()<<count;
}

счетчик всегда равен 1, не смотря на количество запущенных приложений


Название: Re: вписать окно другого приложения в QWidget
Отправлено: OKTA от Апрель 16, 2014, 14:30
Потому что видимо это способ показать окна, принадлежащие только текущему приложению.
Для linux было такое - http://doc.qt.digia.com/solutions/3/qtxembed/qtxembedcontainer.html
Для винды уверен так просто не сделать - все, что можно попробовать, это, как сказал Swa, получить HWND окна целевого приложения и уже с ним изголяться.


Название: Re: вписать окно другого приложения в QWidget
Отправлено: Bepec от Апрель 16, 2014, 14:34
Вкратце - процессы между собой никак не связаны. Точка :D


Название: Re: вписать окно другого приложения в QWidget
Отправлено: Firefox от Апрель 16, 2014, 14:42
QWidget find(WId) можно WId на HWND заменить?
Код:
HWND ff=findWindow("1.exe");
QWidget *wgt= QWidget::find(ff);
wgt->setParent(this->parentWidget());
что-то наподобие такого можно сделать?


Название: Re: вписать окно другого приложения в QWidget
Отправлено: OKTA от Апрель 16, 2014, 14:50
Код:
typedef WId
Platform dependent window identifier.

на винде это и должен быть HWND.
Но так просто не получится))

Скажите лучше, зачем вообще запихивать одно приложение в другое?)


Название: Re: вписать окно другого приложения в QWidget
Отправлено: Bepec от Апрель 16, 2014, 14:52
Я бы за такое не взялся, при всём своём вращении между извращенскими программами. :D


Название: Re: вписать окно другого приложения в QWidget
Отправлено: OKTA от Апрель 16, 2014, 14:57
Windows hooking дает страшную силу, но и изрядно страшен сам по себе  ;D
Второе обычно страшнее  ;D

Посмотрите, как похожие вещи делаются на каком-нибудь Delphi. уж уверен там этого можно добиться - может что полезное будет)

Вот к примеру

http://embarcadero.newsgroups.archived.at/public.delphi.vcl.components.using/201101/1101066733.html
http://stackoverflow.com/questions/7611103/embedding-window-into-another-process


Название: Re: вписать окно другого приложения в QWidget
Отправлено: Firefox от Апрель 16, 2014, 15:03
я не могу менять среду разработки. она прописана в документах. моя задача сделать только оболочку. в линуксе есть пример программы сделаный через Х11 там все работает, а вот в Windows надо сделать такое же.


Название: Re: вписать окно другого приложения в QWidget
Отправлено: Firefox от Апрель 16, 2014, 15:16
Суть для чего я это делаю: Мне надо сделать оболочку, которая запускает 15 программ. в зависимости от нажатой кнопки та или иная программа показывается в определенном месте экрана. И оболочка и программа в данный момент обе должны быть активны. вот смысл для чего это надо. я делаю только оболочку, на которой отображается общие моменты для всех 15 программ и отображение окон программ попеременно.


Название: Re: вписать окно другого приложения в QWidget
Отправлено: OKTA от Апрель 16, 2014, 15:18
Дело не в среде, а в технике  ;) Может там что-то полезное будет и переносимое на Qt, откуда вы знаете?  :)


Название: Re: вписать окно другого приложения в QWidget
Отправлено: Firefox от Апрель 16, 2014, 15:23
там тоже используется SetParent(),в примерах которые Вы показали. Проблема в строчке получается
Код:
QWidget *wgt= QWidget::find(ws);
функция возвращает 0, поэтому SetParent() дальше использовать не получается.


Название: Re: вписать окно другого приложения в QWidget
Отправлено: OKTA от Апрель 16, 2014, 15:39
Запустите только сначала калькулятор и потом MainWindow растяните - он там внутри прячется  ;D
Код:
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;

    HWND test = FindWindowA(0,"Калькулятор");
    SetParent(test, w.winId());
    w.show();
    return a.exec();
}

Все действительно оказалось просто)) find не работало потому что это поиск внутри приложения, а не в системе..


Название: Re: вписать окно другого приложения в QWidget
Отправлено: Bepec от Апрель 16, 2014, 15:48
Проблемы только начинаются :D


Название: Re: вписать окно другого приложения в QWidget
Отправлено: OKTA от Апрель 16, 2014, 15:56
Проблемы только начинаются :D

Для новых проблем будет отдельный топик, а в этом я заслужил шоколадку  ;D


Название: Re: вписать окно другого приложения в QWidget
Отправлено: Firefox от Апрель 16, 2014, 15:56
 :D :D :D :D да точно)))спасибо огромное!!!!!!!


Название: Re: вписать окно другого приложения в QWidget
Отправлено: OKTA от Апрель 16, 2014, 16:09
Пожалуйста) :)


Название: Re: вписать окно другого приложения в QWidget
Отправлено: Alexu007 от Апрель 16, 2014, 17:05
Сделать скриншоты 15-ти программ и выводить на форму картинки.


Название: Re: вписать окно другого приложения в QWidget
Отправлено: Bepec от Апрель 16, 2014, 17:29
to OKTA: Чокопай возьми с полки :)


Название: Re: вписать окно другого приложения в QWidget
Отправлено: Igors от Апрель 17, 2014, 08:21
...а вот далее какими функциями можно реализовать нужную мне весчь?
Рано или поздно все приходят к выводу что такая вещь не нужна :)  Больше забот чем выгод


Название: Re: вписать окно другого приложения в QWidget
Отправлено: Firefox от Апрель 17, 2014, 13:25
Проблемы действительно даже с одной программой запущенной. Очень тормозит приложение добавленное как потомок.


Название: Re: вписать окно другого приложения в QWidget
Отправлено: OKTA от Апрель 17, 2014, 14:11
Может быть не приложение тормозит, а отрисовка тормозит?


Название: Re: вписать окно другого приложения в QWidget
Отправлено: Bepec от Апрель 17, 2014, 14:33
Скорее и то и то :D
"Это только начало" ©


Название: Re: вписать окно другого приложения в QWidget
Отправлено: OKTA от Апрель 17, 2014, 17:31
А как работает отрисовка в случае смены родителя окна?
Все сообщения придется обрабатывать уже новому родителю как я понимаю, а отрисовывать кто должен?


Название: Re: вписать окно другого приложения в QWidget
Отправлено: Bepec от Апрель 17, 2014, 17:43
Вроде бы дитё клеится к очереди сообщений родителя. Хотя не уверен.


Название: Re: вписать окно другого приложения в QWidget
Отправлено: OKTA от Апрель 17, 2014, 17:52
Что-то у меня не получается нагуглить ничего осознанного по тематике работы графики в винде. Натыкался только на то, что обычные окна имеют родителем окно рабочего стола и могут спокойно внутри него перемещаться. А если задать другого родителя, то винда просто будет передавать дочернему окну координаты, в пределах которых оно может двигаться и отрисовываться. В принципе так оно и логично, но интересно все же, почему тормозит.
И еще наткнулся, что в одно время в msdn в разделе о SetParent крайне не рекомендовали им пользоваться, но потом рекомендация исчезла  ;D


Название: Re: вписать окно другого приложения в QWidget
Отправлено: Bepec от Апрель 17, 2014, 23:43
По моей памяти и попытках такое сделать - все сообщения дочернего идут через родителя. Соответственно в 2 раза возрастает нагрузка + некоторые сообщения Qt отхватывает себе и не даёт дочурке. Так же проблемы фокусов, сворачиваний и прочих приколов - я забил на этом моменте. Проще было переписать старую прогу :D


Название: Re: вписать окно другого приложения в QWidget
Отправлено: Firefox от Апрель 30, 2014, 10:32
Конечно уже поняла что не вариант такое делать, но тормозит даже не то чтобы отрисовка, а сигналы нажатия на кнопки не отрабатываются иногда. то есть раз через раз попадает дочернее приложения в слоты по нажатию кнопок.