2012-04-10 39 views
8

Tôi muốn nhúng hai QWidgets vào một cửa sổ được tạo bằng XLib. Tôi đã viết mã này:Nhúng QWidget vào Cửa sổ 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(); 
} 

Tôi có thể chạy chương trình này thành công nhưng các tiện ích này không được nhúng vào cửa sổ X11 mà tôi đã tạo. Cả ba thứ đều được tạo ra, nhưng độc lập. Các tiện ích này không được nhúng vào cửa sổ.

+0

Chek này ra: QX11EmbedWidget – HeyYO

+0

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

+0

Tôi đã sử dụng chứa QX11 cũng làm như vậy. Nhưng tôi cần phải làm điều đó bằng cách sử dụng cửa sổ tạo ra đặc biệt bằng cách sử dụng XLib, và do đó câu hỏi. –

Trả lời

5

điều sau đây sẽ cho biết rằng có lẽ bạn cần phải suy nghĩ về thứ tự hiển thị các tiện ích để winId cho các tiện ích của bạn được đặt thành thứ gì đó có thể được chuyển tới XReparentWindow.

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

+0

Tôi nghĩ rằng những gì bạn đang yêu cầu tôi làm là những gì tôi đã làm? Dù sao tôi đã thử cách khác vòng bằng cách gọi show() cho 2 vật dụng sau khi tái bố mẹ đã được thực hiện, nhưng không có hiệu lực. –

+0

Vâng, sắp xếp lại bố mẹ trước khi xả và hiển thị cửa sổ X11 thực sự đã làm việc :-) Cảm ơn rất nhiều. Và có tiền thưởng. –

+0

@AmitTomar: Bạn có thể vui lòng cung cấp ví dụ đầy đủ không? Nó không hiệu quả với tôi. – theV0ID

2

Là giải pháp thay thế, bạn có thể sử dụng thay vì QX11EmbedWidget QWidget trong ứng dụng qt và giao thức XEmbed trong ứng dụng Xlib, chẳng hạn như làm QX11EmbedContainer này. Giải pháp này có điểm cộng: bạn có thể nhận ra cửa sổ khác nhau trong các quy trình khác nhau.

+0

Mặc dù, điều này chỉ hoạt động cho Qt4, không phải cho Qt5, phải không? Xin giải thích khác đi. – theV0ID

+0

@ theV0ID xem http://doc.qt.io/qt-5/qwidget.html#createWindowContainer cho Qt5 – Milovidov

Các vấn đề liên quan