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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QX11EmbedContainer в никсах....  (Прочитано 7127 раз)
sergebegger
Гость
« : Июль 11, 2010, 16:01 »

Подскажите пожалуйста:

Имеется класс....
Код:
navi::navi(QWidget *parent) :
    QX11EmbedContainer(parent)
{
    QString wId = QString::number(winId());
    setenv("NAVIT_XID", wId.toAscii(), 1);
    process = new QProcess(this);
    process->start("navit");
}
при клике мышью в окне Navit-a иксы теряют связь с мышью, помогает kill основного приложения.

Как исправить Непонимающий
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #1 : Июль 12, 2010, 10:46 »

А без выставления "NAVIT_XID", т.е. navit в своём окне, всё нормально?
Записан

Qt 5.11/4.8.7 (X11/Win)
sergebegger
Гость
« Ответ #2 : Июль 12, 2010, 15:41 »

А без выставления "NAVIT_XID", т.е. navit в своём окне, всё нормально?
Да, в своём окне Navit функционирует нормально, и даже если сделать методом проб и ошбок -например так:
setWindowFlags(Qt::SplashScreen);
т.е. Navit в отдельном виджете - то всё функционирует нормально....
Записан
andrew.k
Гость
« Ответ #3 : Октябрь 28, 2010, 15:50 »

А без выставления "NAVIT_XID", т.е. navit в своём окне, всё нормально?
Да, в своём окне Navit функционирует нормально, и даже если сделать методом проб и ошбок -например так:
setWindowFlags(Qt::SplashScreen);
т.е. Navit в отдельном виджете - то всё функционирует нормально....

А у меня другая  проблема.
После слияния встроенный виджет (и все его дочерние) не могут получить фокус. Работают только щелчки мышкой. Например щелчок на кнопке срабатывает и выполняется связаный с ним сигнал. А например, в текстовое поле нельзя ничего ввести с клавиатуры.
Вторая проблема, что встроенный виджет не ресайзится по правилам лэйаута в котором он лежит. Он становится фиксированного размера и при чрезмерном уменьшении формы например, просто уезжает за край (т.е. половина виджета видна, половина нет).

Почему так? кто с этим сталкивался? qt4.4 ОС МСВС (линукс)
Записан
BigZ
Гость
« Ответ #4 : Октябрь 28, 2010, 17:46 »

А без выставления "NAVIT_XID", т.е. navit в своём окне, всё нормально?
Да, в своём окне Navit функционирует нормально, и даже если сделать методом проб и ошбок -например так:
setWindowFlags(Qt::SplashScreen);
т.е. Navit в отдельном виджете - то всё функционирует нормально....

А у меня другая  проблема.
После слияния встроенный виджет (и все его дочерние) не могут получить фокус. Работают только щелчки мышкой. Например щелчок на кнопке срабатывает и выполняется связаный с ним сигнал. А например, в текстовое поле нельзя ничего ввести с клавиатуры.
Вторая проблема, что встроенный виджет не ресайзится по правилам лэйаута в котором он лежит. Он становится фиксированного размера и при чрезмерном уменьшении формы например, просто уезжает за край (т.е. половина виджета видна, половина нет).

Почему так? кто с этим сталкивался? qt4.4 ОС МСВС (линукс)
А не рассматривали вариант заменить QX11EmbedContainer  на gtk_socket_new()
http://library.gnome.org/devel/gtk/unstable/GtkSocket.html? Мы оказались от QX11EmbedContainer  в пользу gtk_socket_new(), когда встраивали Flash Player в Qt в компоненте - http://www.devmachines.com/qtitanmm_descr.php.
Там нужно прослойку небольшую написать, но в результате получаем стабильную схему. Единственное условие -  ваша Qt должна быть на GTK эвентлупе
« Последнее редактирование: Октябрь 28, 2010, 17:48 от BigZ » Записан
andrew.k
Гость
« Ответ #5 : Октябрь 28, 2010, 18:40 »

А без выставления "NAVIT_XID", т.е. navit в своём окне, всё нормально?
Да, в своём окне Navit функционирует нормально, и даже если сделать методом проб и ошбок -например так:
setWindowFlags(Qt::SplashScreen);
т.е. Navit в отдельном виджете - то всё функционирует нормально....

А у меня другая  проблема.
После слияния встроенный виджет (и все его дочерние) не могут получить фокус. Работают только щелчки мышкой. Например щелчок на кнопке срабатывает и выполняется связаный с ним сигнал. А например, в текстовое поле нельзя ничего ввести с клавиатуры.
Вторая проблема, что встроенный виджет не ресайзится по правилам лэйаута в котором он лежит. Он становится фиксированного размера и при чрезмерном уменьшении формы например, просто уезжает за край (т.е. половина виджета видна, половина нет).

Почему так? кто с этим сталкивался? qt4.4 ОС МСВС (линукс)
А не рассматривали вариант заменить QX11EmbedContainer  на gtk_socket_new()
http://library.gnome.org/devel/gtk/unstable/GtkSocket.html? Мы оказались от QX11EmbedContainer  в пользу gtk_socket_new(), когда встраивали Flash Player в Qt в компоненте - http://www.devmachines.com/qtitanmm_descr.php.
Там нужно прослойку небольшую написать, но в результате получаем стабильную схему. Единственное условие -  ваша Qt должна быть на GTK эвентлупе


Думаю это слишком сложный вариант. Особенно с учетом того, что я не понимаю, что такое "ваша Qt должна быть на GTK эвентлупе".
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #6 : Октябрь 28, 2010, 18:47 »

Вот работающий пример:
Код
C++ (Qt)
#include <QApplication>
#include <QX11EmbedWidget>
#include <QX11EmbedContainer>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QLineEdit>
#include <QPushButton>
#include <QGroupBox>
#include <QProcess>
 
int main( int argc, char* argv[] )
{
   QApplication a( argc, argv );
 
   QWidget* w;
   if( argc > 1 )
       w = new QWidget;
   else
       w = new QX11EmbedWidget;
 
   QVBoxLayout vl( w );
   QHBoxLayout l;
 
   vl.addLayout( &l );
 
   QPushButton pb1( "One" );
   QPushButton pb2( "Two" );
   QLineEdit le1;
   QLineEdit le2;
 
   l.addWidget( &pb1 );
   l.addWidget( &le1 );
   l.addWidget( &pb2 );
   l.addWidget( &le2 );
 
   QX11EmbedContainer* ec;
   if( argc > 1 )
   {
       QGroupBox* gb = new QGroupBox( "Containter" );
       vl.addWidget( gb );
       QHBoxLayout* l = new QHBoxLayout( gb );
       ec = new QX11EmbedContainer;
       l->addWidget( ec );
   }
 
   w->show();
 
   QProcess* proc;
 
   if( argc > 1 )
   {
       ec->embedClient( atol( argv[1] ) );
   }    else
   {
       proc = new QProcess( w );
       proc->start( (const char*) argv[0], QStringList( QString::number( w->winId() ) ) );
   }
 
   return a.exec();
}
 

Единственный косяк - фокус во встроенном окне начинает работать только после нажатий на Tab.
Записан

Qt 5.11/4.8.7 (X11/Win)
BigZ
Гость
« Ответ #7 : Октябрь 28, 2010, 19:17 »

Думаю это слишком сложный вариант. Особенно с учетом того, что я не понимаю, что такое "ваша Qt должна быть на GTK эвентлупе".
Речь про этот механизм
http://labs.qt.nokia.com/2006/02/24/qt-and-glib/
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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