Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: traktort от Март 02, 2016, 12:23



Название: createWindowContainer и встраивание в окно
Отправлено: traktort от Март 02, 2016, 12:23
Добрый день!

Подскажите, пожалуйста, пользовался ли кто-нибудь createWindowContainer?

Создаю виджет wi, получаю его WId, а из него получаю QWindow *myWindow.
В лайаут окна приложения вставляю QWidget.

Код:
    wi->show();
    WId wid = wi->winId();
    QWindow* myWindow = QWindow::fromWinId(wid);

    QWidget* widget = QWidget::createWindowContainer(myWindow);
    widget->setMaximumSize(100,100);
    ui->horizontalLayout_2->addWidget(widget);

В итоге работает через раз (почему?), да еще и не так, как надо.
То есть окно первого виджета остается существовать, но его содержимое (кнопочка у меня) отсутствует - она появляется в окне приложения. Как избавиться от оставшегося пустого окошка непонятно. Запуталась я)

И самое главное - могу ли я встроить не свой виджет в окно, а стороннее приложение, например, калькулятор стандартный?

Всем ответившим заранее спасибо! :-*


Название: Re: createWindowContainer и встраивание в окно
Отправлено: Igors от Март 02, 2016, 13:05
createWindowContainer необходим для встраивания QOpenGLWindow, о каких-то других разумных применениях мне ничего не известно. Он капризничает с обработкой событий, это решаемо, но создавать его "просто так" не видно смысла

И самое главное - могу ли я встроить не свой виджет в окно, а стороннее приложение, например, калькулятор стандартный?
Нет (во всяком случае средствами Qt)


Название: Re: createWindowContainer и встраивание в окно
Отправлено: traktort от Март 02, 2016, 13:30
Нет (во всяком случае средствами Qt)

То есть выхода нет никакого? =(
Не могу найти ничего полезного по этой теме, а ведь такая интересная опция.

Вот тут баг, но, видимо, делается то же, что хочу я.
https://bugreports.qt.io/browse/QTBUG-44404 (https://bugreports.qt.io/browse/QTBUG-44404)


Название: Re: createWindowContainer и встраивание в окно
Отправлено: Igors от Март 02, 2016, 13:42
Вот тут баг, но, видимо, делается то же, что хочу я.
https://bugreports.qt.io/browse/QTBUG-44404 (https://bugreports.qt.io/browse/QTBUG-44404)
Ну а почему Вы так решили? Другое приложение имеет другое адресное пр-во, общаться с ним из своего - дело непростое (и немаленькое), нужна солидная, возможно платформо-зависимая, технология. А решить это "просто созданием какого-то окна" точно не удастся :)  И, в конце-концов, много ли счастья от "встроенного калькулятора"?  :)


Название: Re: createWindowContainer и встраивание в окно
Отправлено: traktort от Март 02, 2016, 14:39
нужна солидная, возможно платформо-зависимая, технология

Я представляла это несколько иначе. Окно стороннего приложения "обрезается" сверху, что бы не было красного крестика и т.д. И положение его = положению виджета-контейнера. И размер. И оно поверх окна.

Знать бы, как запустить "калькулятор" поверх всех окон, сделать его нужного размера и в нужном месте расположить...


много ли счастья от "встроенного калькулятора"?  :)

У меня было бы много =)


Название: Re: createWindowContainer и встраивание в окно
Отправлено: Racheengel от Март 02, 2016, 15:08
Ну, если этот калькулятор существует в виде СОМ-компоненты или чего-то подобного, то, тогда, как-то можно.
Иначе никак.


Название: Re: createWindowContainer и встраивание в окно
Отправлено: Igors от Март 02, 2016, 15:20
Знать бы, как запустить "калькулятор" поверх всех окон, сделать его нужного размера и в нужном месте расположить...
Ну это как раз решаемо - окно калькулятора доступно через WinAPI. Но если Вы выбрали эту задачу в целях обучение, то это неудачный выбор, тут мало чему можно научиться, все сведется к зубрежке API


Название: Re: createWindowContainer и встраивание в окно
Отправлено: traktort от Март 02, 2016, 15:27
Ну это как раз решаемо - окно калькулятора доступно через WinAPI.

У меня linux. В нем есть какой-то доступ к окну?))


Название: Re: createWindowContainer и встраивание в окно
Отправлено: Igors от Март 02, 2016, 15:41
У меня linux. В нем есть какой-то доступ к окну?))
Ваше упорство заслуживает лучшего применения  :)


Название: Re: createWindowContainer и встраивание в окно
Отправлено: Racheengel от Март 02, 2016, 16:20
А можно узнать, для чего подобное понадобилось?
Возможно есть другие, более простые пути решения.


Название: Re: createWindowContainer и встраивание в окно
Отправлено: traktort от Март 03, 2016, 08:35
А можно узнать, для чего подобное понадобилось?
Возможно есть другие, более простые пути решения.


Допустим, есть расчетная программа. И есть десяток калькуляторов (разных, например химический и т.д.) Все десять калькуляторов есть в виде исполняемых файлов. Очень удобно было бы поставить на форму расчетной программы tab-widget, в каждую вкладку впихнуть калькулятор и по необходимости открывать то один, то другой =) А не 100500 окон открыть и запутаться, какой что считает.

Пока ничего не удалось придумать ((


Название: Re: createWindowContainer и встраивание в окно
Отправлено: Racheengel от Март 03, 2016, 11:40
Ну тогда все равно получится "каша из интерфейсов", ведь каждый калькулятор, скорее всего, имеет свой неповторимый гуй и о наличии других ничего не знает. Т.е. обмен рассчетами только через буфер обмена, никаких общих данных и т.д. Было бы хорошо сдружить их на уровне единого приложения, если бы были исходники :) Но, я так понимаю, это не Ваш случай?


Название: Re: createWindowContainer и встраивание в окно
Отправлено: qate от Март 03, 2016, 13:50
идея интересная
пример из багрепорта "работает", но не могу получить window id чужого окна


Название: Re: createWindowContainer и встраивание в окно
Отправлено: traktort от Март 04, 2016, 23:49
Было бы хорошо сдружить их на уровне единого приложения, если бы были исходники :) Но, я так понимаю, это не Ваш случай?

Да, именно так.


Название: Re: createWindowContainer и встраивание в окно
Отправлено: traktort от Март 04, 2016, 23:51
идея интересная
пример из багрепорта "работает", но не могу получить window id чужого окна


Не то слово)
"Работает" - это как?
У меня ненормально работает, в ст написала.
Какой у вас Qt?


Название: Re: createWindowContainer и встраивание в окно
Отправлено: Old от Март 05, 2016, 07:53
И самое главное - могу ли я встроить не свой виджет в окно, а стороннее приложение, например, калькулятор стандартный?
Это зависит от того, какое рабочее окружение вы используете.
Если KDE, то там есть KParts. У Gnome - Bonobo.


Название: Re: createWindowContainer и встраивание в окно
Отправлено: traktort от Март 05, 2016, 14:49
Это зависит от того, какое рабочее окружение вы используете.
Если KDE, то там есть KParts. У Gnome - Bonobo.

Видимо, в моем случае это возможно.
Но встраивается окно один раз из десяти попыток))
Да и остается окно от встраиваемого калькулятора, оно пустое, но, если я меняю его размер или сворачиваю или закрываю, то встроенный виджет все за ним повторяет Оо...


Название: Re: createWindowContainer и встраивание в окно
Отправлено: traktort от Март 05, 2016, 15:02
Но встраивается окно один раз из десяти попыток))


А, нет. Пригляделась. Калькулятор появляется в нужном месте, но сразу же потом исчез и появился отельным окном.
Что за фигня...


Название: Re: createWindowContainer и встраивание в окно
Отправлено: Old от Март 05, 2016, 16:26
Видимо, в моем случае это возможно.
Это возможно если вы используете одну из технологий, которая это обеспечивает. И встраиваемая программа должна использовать эту же технологию. Само встроиться и работать ничего не будет. :)


Название: Re: createWindowContainer и встраивание в окно
Отправлено: Racheengel от Март 05, 2016, 17:03
В любом случае решение будет платформозависимым.
Например типа этого: http://stackoverflow.com/questions/5767992/want-to-resize-other-applications-running-in-windows


Название: Re: createWindowContainer и встраивание в окно
Отправлено: traktort от Март 06, 2016, 18:32
Видимо, в моем случае это возможно.
Это возможно если вы используете одну из технологий, которая это обеспечивает. И встраиваемая программа должна использовать эту же технологию. Само встроиться и работать ничего не будет. :)


Я вот не знаю какую технологию использует createWindowContainer.
А уж тем более какие-то программы.

Можно какую-нибудь ссылку (понятную желательно, в идеале на русском), как написать встраиваемую и встраивающую программы? ))
Речь об этом: http://wiki.linuxformat.ru/wiki/LXF85:Qt/KDE (http://wiki.linuxformat.ru/wiki/LXF85:Qt/KDE) ?



Итого. Сделала я встраивание любого окна по его windowTitle. Запускаю калькулятор свой, нахожу его WId, делаю контейнер. Окно калькулятора остается отдельным окном(( На форме что-то дергается, но не появляется калькулятора.

Иногда (я даже не пойму при каких таких стечения обстоятельств) появляется виджет калькулятора. И этот калькулятор даже работает! Но отдельно продолжает висеть пустое окно, ошметок калькулятора(((

И самое внезапное. На win это же самое срабатывает! Правда все равно выглядит это не очень то...


Название: Re: createWindowContainer и встраивание в окно
Отправлено: traktort от Март 06, 2016, 18:33
В любом случае решение будет платформозависимым.
Например типа этого: http://stackoverflow.com/questions/5767992/want-to-resize-other-applications-running-in-windows

Разница только в "нахождении" окна по его имени.
Если бы это была единственная проблема!((

Очень жаль, но похоже это нереально.


Название: Re: createWindowContainer и встраивание в окно
Отправлено: Old от Март 06, 2016, 18:56
Можно какую-нибудь ссылку (понятную желательно, в идеале на русском), как написать встраиваемую и встраивающую программы? ))
Речь об этом: http://wiki.linuxformat.ru/wiki/LXF85:Qt/KDE (http://wiki.linuxformat.ru/wiki/LXF85:Qt/KDE) ?
Да, речь об этом. KParts штатная технология KDE для этого.
По ссылке есть пример, а дальше смотрите исходники KDE.


Название: Re: createWindowContainer и встраивание в окно
Отправлено: qate от Март 09, 2016, 08:16
"Работает" - это как?
У меня ненормально работает, в ст написала.
Какой у вас Qt?

ну как описано в багрепорте - окно дочернего приложения запускается "внутри" родителя
но я не могу понять как получить id не моего окна, например kcalc - то что выдает xprop почемуто не подходит
версия qt 551, opensuse 13.1 64 bit