Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: sergebegger от Июль 11, 2010, 16:01



Название: QX11EmbedContainer в никсах....
Отправлено: 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 основного приложения.

Как исправить ???


Название: Re: QX11EmbedContainer в никсах....
Отправлено: GreatSnake от Июль 12, 2010, 10:46
А без выставления "NAVIT_XID", т.е. navit в своём окне, всё нормально?


Название: Re: QX11EmbedContainer в никсах....
Отправлено: sergebegger от Июль 12, 2010, 15:41
А без выставления "NAVIT_XID", т.е. navit в своём окне, всё нормально?
Да, в своём окне Navit функционирует нормально, и даже если сделать методом проб и ошбок -например так:
setWindowFlags(Qt::SplashScreen);
т.е. Navit в отдельном виджете - то всё функционирует нормально....


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

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

Почему так? кто с этим сталкивался? qt4.4 ОС МСВС (линукс)


Название: Re: QX11EmbedContainer в никсах....
Отправлено: BigZ от Октябрь 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 эвентлупе


Название: Re: QX11EmbedContainer в никсах....
Отправлено: andrew.k от Октябрь 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 эвентлупе".


Название: Re: QX11EmbedContainer в никсах....
Отправлено: GreatSnake от Октябрь 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.


Название: Re: QX11EmbedContainer в никсах....
Отправлено: BigZ от Октябрь 28, 2010, 19:17
Думаю это слишком сложный вариант. Особенно с учетом того, что я не понимаю, что такое "ваша Qt должна быть на GTK эвентлупе".
Речь про этот механизм
http://labs.qt.nokia.com/2006/02/24/qt-and-glib/