2012-04-10 25 views
8

XLib kullanılarak oluşturulan bir pencereye iki QWidget gömmek istiyorum.QWidget'i X11 Penceresine Katıştırma

// Assume all the necessary headers included 

int main(int argc, char *argv[]) 
{ 
    QApplication app(argc, argv); 

    // Create widget 1 
    QWidget widget1 ; 
    widget1.setGeometry(44,44,666,666); 
    widget1.show(); 

    // Create widget 2 
    QWidget widget2 ; 
    widget2.setGeometry(144,144,666,666); 
    widget2.show();  

    Display *display = XOpenDisplay(0); // 0 parameter for default values 

    if (display != NULL) 
    { 
     // Create the x11 window using XLib 
     Window w = XCreateWindow(display, DefaultRootWindow(display), 
     0, 0, 1200, 1100, 0,CopyFromParent, CopyFromParent, CopyFromParent, 0, 0); 

     XMapWindow(display, w); 
     XFlush(display); 

     XReparentWindow(display, widget1.winId(), w, 0, 0); 
     XReparentWindow(display, widget2.winId(), w, 1, 10); 
    } 

    else 
     std::cout << "Error: Opening display" << std::endl ; 

     return app.exec(); 
} 

başarıyla bu programı çalıştırmak mümkün ama bu aletler Oluşturduğum X11 penceresine gömülü sakın: Bu kodu yazdım. Her üç şey de yaratılıyor, ama bağımsız olarak. Bu widget'lar pencereye gömülmez.

+0

Chek bunu: QX11EmbedWidget – HeyYO

+0

[QX11EmbedWidget] (http://qt-project.org/doc/qt-4.8/qx11embedwidget.html) –

+0

aynı yapmak için kullanılan QX11 kabı oldu. Ama özellikle XLib kullanılarak oluşturulan pencereyi kullanarak ve bu yüzden soruyu yapmalıyım. –

cevap

5

Aşağıdakiler, widget'larınızın görüntülenme sırasını düşünmeniz gerektiğini gösterir; böylece, widget'larınız için winId, XReparentWindow'a geçirilebilecek bir şeye ayarlanır. Alternatif bir çözüm olarak

http://www.qtforum.org/article/16529/xreparent-external-x11-application.html

+0

Sanırım yapmamı istediğin şey şu an yaptığım şey mi? Her neyse ben yeniden ebeveynlik yapıldıktan sonra 2 widget için show() çağırarak, ancak hiçbir etkisi olmadan başka bir şekilde denedim. –

+0

Peki, yeniden kızarma ve X11 penceresini görüntülemeden önce yeniden ebeveynlik yeniden düzenleme :-) Çok teşekkürler. Ve ödül var. –

+0

@AmitTomar: Tam çalışma örneği verebilir misiniz? Benim için çalışmıyor. – theV0ID

2

, bu tür bu QX11EmbedContainer yapıyor olarak xlib uygulamasında qt uygulama ve XEmbed protokolü içinde QX11EmbedWidget yerine QWidget kullanmak can. Bu çözümün bir artı vardır: farklı işlemlerde farklı pencere gerçekleştirebilirsiniz.

+0

Yine de, bu sadece Qt4 için çalışıyor, Qt5 için değil, değil mi? Lütfen başka türlü açıklayınız. – theV0ID

+0

@VVID, Qt5 için bkz. Http://doc.qt.io/qt-5/qwidget.html#createWindowContainer – Milovidov

İlgili konular