2012-04-10 27 views
8

में QWidget एम्बेड करना मैं XLib का उपयोग करके बनाई गई विंडो में दो QWidgets एम्बेड करना चाहता हूं।X11 विंडो

// 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(); 
} 

मैं इस कार्यक्रम को सफलतापूर्वक चलाने के लिए सक्षम हूँ, लेकिन इन विजेट X11 खिड़की मैं बनाया में एम्बेड नहीं किया जा रहा है: मैं इस कोड लिखा है। सभी तीन चीजें बनाई जा रही हैं, लेकिन स्वतंत्र रूप से। ये विजेट खिड़की में एम्बेडेड नहीं हो रहे हैं।

+0

Chek इस बाहर: QX11EmbedWidget – HeyYO

+0

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

+0

मैं भी ऐसा ही करने का इस्तेमाल किया QX11 कंटेनर पड़ा है। लेकिन मुझे विशेष रूप से XLib का उपयोग करके बनाए गए विंडो का उपयोग करके इसे करने की ज़रूरत है, और इसलिए सवाल है। –

उत्तर

5

निम्नलिखित इंगित करेंगे कि शायद आपको विजेट प्रदर्शित करने के आदेश के बारे में सोचना होगा ताकि आपके विजेट के लिए winId कुछ ऐसा सेट हो जाए जो XReparentWindow को पारित किया जा सके।

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

+0

मुझे लगता है कि आप मुझसे क्या करने के लिए कह रहे हैं वह है जो मैं पहले से कर रहा हूं? वैसे भी मैंने पुन: parenting के बाद 2 विजेट्स के लिए शो() को कॉल करके दूसरे तरीके से कोशिश की, लेकिन इसका कोई प्रभाव नहीं पड़ा। –

+0

ठीक है, X11 विंडो को फ्लश करने और प्रदर्शित करने से पहले पुन: parenting को पुन: व्यवस्थित करना वास्तव में काम किया :-) बहुत बहुत धन्यवाद। और वहां बक्षीस जाता है। –

+0

@AmitTomar: क्या आप एक पूर्ण-कार्य उदाहरण प्रदान कर सकते हैं? यह मेरे लिए काम नहीं करता है। – theV0ID

2

वैकल्पिक समाधान के रूप में, आप इस तरह इस QX11EmbedContainer कर के रूप में क्यूटी आवेदन और Xlib आवेदन में XEMBED प्रोटोकॉल, में QX11EmbedWidget बजाय QWidget उपयोग करने के लिए कर सकते हैं। इस समाधान में एक प्लस है: आप विभिन्न प्रक्रियाओं में अलग-अलग विंडो का एहसास कर सकते हैं।

+0

हालांकि, यह केवल क्यूटी 4 के लिए काम करता है, क्यूटी 5 के लिए नहीं, है ना? कृपया अन्यथा बताएं। – theV0ID

+0

@ theV0ID देखें http://doc.qt.io/qt-5/qwidget.html#createWindowContainer Qt5 के लिए – Milovidov