Russian Qt Forum
Ноябрь 25, 2024, 16:20 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Открыть внешнее приложение внутри программы  (Прочитано 5712 раз)
korish
Гость
« : Сентябрь 20, 2012, 16:36 »

Есть скомпилированный исполняемый файл (prog_compiled). Необходимо написать программу (myprog), которая при запуске покажет окно (Виджет) в котором будет запущена другая программа (prog_compiled).

В данный момент имеется исполняемый файл (prog_compiled) и программа (myprog_2) которая после запуска открывает виджет. Рядом в новом окне открывается (prog_compiled). Для этого я воспользовался командой m_process->start("prog_compiled") и вставил ее в конструктор виджета.

Как сделать так чтобы (prog_compiled) исполнялась внутри виджета программы (myprog_2) а не в отдельном окне?
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #1 : Сентябрь 20, 2012, 16:56 »

Мдя...
Ох и много же тебе ещё нужно учить, учить и учить...
Ибо полностью отсутствуют базовые знания межпроцессорного и межоконного взаимодействия Непонимающий
« Последнее редактирование: Сентябрь 20, 2012, 16:58 от GreatSnake » Записан

Qt 5.11/4.8.7 (X11/Win)
andrew.k
Гость
« Ответ #2 : Сентябрь 20, 2012, 17:11 »

тут опасно конечно советовать Улыбающийся
Но возможно человека интересует технология XEmbed.
посмотри класс QX11EmbedContainer и сопутствующие.
Но prog_compiled естественно должно поддерживать встраивание. Т.е. просто произвольное не получится встроить (на сколько мне известно).
Я немного экспериментировал с этим, но нарвался на определенные глюки с фокусом ввода виджетов и забросил это дело, как неприемлемое, возможно сейчас ситуация обстоит лучше.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #3 : Сентябрь 20, 2012, 17:15 »

Я немного экспериментировал с этим, но нарвался на определенные глюки с фокусом ввода виджетов и забросил это дело, как неприемлемое, возможно сейчас ситуация обстоит лучше.
Вот это и есть главная проблема, которую не решить средствами Qt Грустный
Записан

Qt 5.11/4.8.7 (X11/Win)
andrew.k
Гость
« Ответ #4 : Сентябрь 20, 2012, 17:20 »

Я немного экспериментировал с этим, но нарвался на определенные глюки с фокусом ввода виджетов и забросил это дело, как неприемлемое, возможно сейчас ситуация обстоит лучше.
Вот это и есть главная проблема, которую не решить средствами Qt Грустный
Оно выглядело вполне полноценно и работоспособно. Но баги были.
В частности почему-то с многострочным текстовым редактором. Он не мог получить фокус.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #5 : Сентябрь 20, 2012, 17:39 »

Именно проблемы с фокусом я и имею в виду.
С этой проблемой я столкнулся ещё когда эмбеддил окна на Motif-е.
Пришлось залезать в "кишки" motif-a + налаживать общение приложений.
XEmbed появился намого позже)
Почему тролли до конца не доделали его поддержку мне непонятно. Наверное потому, что в апплетах фокус не нужен, а больше никто и не просил.
Кстати, под виндой всё придётся делать через winapi и как связать встроенное окно с фокус-менеджером главного окна очень большой вопрос.
Записан

Qt 5.11/4.8.7 (X11/Win)
korish
Гость
« Ответ #6 : Сентябрь 24, 2012, 11:20 »

тут опасно конечно советовать Улыбающийся
Но возможно человека интересует технология XEmbed.
посмотри класс QX11EmbedContainer и сопутствующие.
Но prog_compiled естественно должно поддерживать встраивание. Т.е. просто произвольное не получится встроить (на сколько мне известно).
Я немного экспериментировал с этим, но нарвался на определенные глюки с фокусом ввода виджетов и забросил это дело, как неприемлемое, возможно сейчас ситуация обстоит лучше.

Поробовал воспользоваться QX11EmbedContainer и вот что получилось:

#include <QtGui>
#include <QX11EmbedContainer>

Код:
    int main(int argc, char *argv[])
 {
     QApplication app(argc, argv);
     qDebug() << argc;
     qDebug() << argv[1];

     if (app.arguments().count() != 2) {
         qFatal("Error - expected executable path as argument");
         return 1;
     }

     QX11EmbedContainer mainWidget;
     mainWidget.show();

     QProcess process(&mainWidget);
     QString executable(app.arguments()[1]);
     QStringList arguments;
     //arguments << QString::number(mainWidget.clientWinId());
     arguments << QString::number(mainWidget.winId());
     qDebug() << executable << arguments;
     process.start(executable, arguments);

     return app.exec();
 }

Запускаю программу передавая в командной строке путь к исполняемому файлу который хочу встроить. Не могу понять чего не работает.  qDebug()  выводит путь к исполняемому файлу для запуска и winId mainWidget как я понимаю. Возможно из-за того что встраиваемый исполняемый файл не подготовлен для такого запуска?
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #7 : Сентябрь 24, 2012, 11:26 »

Хм... всё нужно делать наоборот.
См. здесь как.
Записан

Qt 5.11/4.8.7 (X11/Win)
korish
Гость
« Ответ #8 : Сентябрь 24, 2012, 16:16 »

На stackoverflow нашел почти то что нужно:
Код:
int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    QX11EmbedContainer container;
    container.show();

    QProcess * process = new QProcess(&container);
    QString executable("xterm");
    QStringList arguments;
    arguments << "-into";
    arguments << QString::number(container.winId());
    process->start(executable, arguments);

    int status = app.exec();
    process->close();
    return status;
}

Пробовал вместо xterm запускать свой исполняемый файл но так просто не получается, каким образом можно доработать данный пример?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.049 секунд. Запросов: 23.