LINUX.ORG.RU

Встраивание программы в окно приложения qt

 , ,


0

2

Здравствуйте, гуру! Помогите, пожалуйста =)

На форме моего приложения есть виджет, в него надо всунуть внешнюю программу.

Тут казалось бы все написано, но нет.

Вот написала код:

    QProcess *proc = new QProcess(this);
    int id = ui->widgetExternal->winId();
    QStringList arguments;
    arguments << "-wid" << QString::number((int)winId());
    //arguments << "xterm -into" << QString::number((int)winId());
    QString pathProg = "/mypath/mypath/Calc";
    proc->setProgram(pathProg);
    proc->setArguments(arguments);
    proc->start();

Внешняя программка (Calc) прекрасно запускается, но отдельным окном((

А надо именно в виджете, то есть что бы этот калькулятор стал частью формы.

linux типа debian, qt5.3

Как быть?

Заранее всем спасибо!

Ответ на: комментарий от alex4321

Я так понимаю, это в qt4. А в qt5 нет такой штуки. Уже пыталась.

traktor ()

Внешняя программка (Calc) прекрасно запускается, но отдельным окном((

А она точно умеет запускаться внутри другого окна?

Deleted ()
Ответ на: комментарий от Deleted

Раньше был QX11EmbedContainer, в который (как я поняла из документации) можно было поместить что угодно.

Как в qt5 это сделать я не могу найти.

Или нужны только какие-то Особые Программы?

traktor ()
Ответ на: комментарий от traktor

Вот что нагуглил по «qx11embedcontainer qt5» :

"https://forum.qt.io/topic/32785/qwindow-qwidget-qt5-x11embedding-how/6"

«Hi,

In Qt 5.1, use „QWindow::fromWinId()“:http://qt-project.org/doc/qt-5.1/qtgui/qwindow.html#fromWinId followed by QWidget::createWindowContainer(). This is similar to constructing a QX11EmbedWidget and then calling QX11EmbedWidget::embedInto().

Note: The QWindow can be a standalone window. If you don't need QWidgets, you don't need to call QWidget::createWindowContainer()

[quote author=„cseder“ date=„1381182948“]I think you need to choose the source components and build those.It makes no sense to install the source components and then compile that source yourself. If it's in „source components“, then you can already install the pre-built (and tested) binaries.»

Только если так - нужно ещё предварительно определить id окна.

ЕМНИП, встроить QWindow как потомка своего виджета - хоть и костыль, но возможно же.

alex4321 ()
Ответ на: комментарий от CrossFire

Да, видела.

Не могу разобраться, как этим воспользоваться((

Вот это должно быть:

    QWidget* myWidget = QWidget::createWindowContainer(myWindow);
    QProcess *proc = new QProcess(myWidget);
    ui->layout_2->addWidget(myWidget);

А что за myWindow? Ниже что-то явно неправильное:

int id = ui->widgetExternal->winId();
QWindow* myWindow = QWindow::fromWinId(id);

traktor ()
Ответ на: комментарий от alex4321

ещё предварительно определить id окна.

окна калькулятора, который надо встроить?

traktor ()

Тут пример.

Только программа должна возвращать свой winId.

Меня пугает строчка:

processWid = process.readAll().toUInt();

traktor ()
Ответ на: комментарий от traktor

Можно запустить её и с помощью API X-в перебирать окна до нахождения нужного же. Это если нет возможности вмешаться в её работу,а иначе - да, логично на stdout выдать.

alex4321 ()
Ответ на: комментарий от alex4321

Встроить с помощью createWindowContainer не удается((

Он, похоже, для этого не предназначен вовсе.

А где (как) выводить WId приложения, что бы сработала строчка :

processWid = process.readAll().toUInt();

У меня только при закрытии выводится.

traktor ()
Ответ на: комментарий от traktor

WId получается из обращения к менеджеру напрямую. Т.е. в случае иксов - XLib. Для такой задачи я под плюсы адаптировал код из wmctl.

PS указанный метод работает в qt5 нормально, но, возможно, немного костыльно (тебе нужно ждать пока у процесса появится окно).

arcanis ★★★★ ()
Последнее исправление: arcanis (всего исправлений: 1)
Ответ на: комментарий от arcanis

PS указанный метод работает в qt5 нормально

О каком методе речь?

Так как не осилила получение WId любого окна, взяла свой же виджет. И один виджет пытаюсь засунуть в другой с помощью createWindowContainer. Происходит что-то невероятное, через раз виджет вставляется, но! при этом его окно остается, правда пустое, без самого виджета. И меняя размеры этого пустого окна можно менять размер встроенного в другое окно виджета. Короче на это страшно смотреть.

Может я что-то не так делаю.

wi->show();// виджет для впихивания в другое окно

WId wid = wi->winId();
QWindow* myWindow = QWindow::fromWinId(wid);
QWidget* widget = QWidget::createWindowContainer(myWindow);
ui->horizontalLayout_2->addWidget(widget);
traktor ()
Ответ на: комментарий от traktor

Так как не осилила получение WId любого окна

https://sites.google.com/site/tstyblo/wmctrl

тут есть сишный код для получения связки pid <> WId

Может я что-то не так делаю.

код встраивания правильный, вангую, что wi - это виджет внутри основного окна. Создай отдельное окно QMainWindow, вызови его и попробуй встроить.

arcanis ★★★★ ()
Ответ на: комментарий от arcanis

Нет, wi создаю в коде.

   wi = new QWidget();
    QHBoxLayout *hl = new QHBoxLayout(wi);
    QPushButton *bt = new QPushButton("123");    
    hl->addWidget(bt);
    wi->show();

Попробовала с QMainWindow, создала новую форму, в дизайнере нарисовала, но и она не вставляется нормально. Те же странности.

У вас какой Qt? Может версия моя неугодная какая-то(

traktor ()
Ответ на: комментарий от traktor

Чем закончилось?

Чем закончилось? Какое решение данной задачи?

dduck ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.