Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > [Qt 4.8.1] [x11] Задание родительского окна


Автор: babutta 23.5.2013, 15:10
Всем здрасти.

Никак не получается посадить имеющееся окно в иксах на QWidget что бы встроить в Qt приложение.
Т.е. есть Qt приложение и в нём создаётся окно для GL вывода средствами xlib, т.е. функцией XCreateWindow (это не моё, святое, изменять не могу).
Мне необходимо созданное таким образом GL-ное окно посадить в своё Qt-приложение.

Прочёл в документации:
void QWidget::create ( WId window = 0, bool initializeWindow = true, bool destroyOldWindow = true ) [protected]
Creates a new widget window if window is 0, otherwise sets the widget's window to window.

Initializes the window (sets the geometry etc.) if initializeWindow is true. If initializeWindow is false, no initialization is performed. This parameter only makes sense if window is a valid window.
...

написал для проверки работоспособности защищённой функции QWidget::create такой код:
Код

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

    QPushButton* button = new QPushButton("MEGA BUTTON");
    button->show();

    ParentWindow w(button->winId());
    w.show();
    
    return a.exec();
}



где ParentWindow описан как:
Код

class ParentWindow : public QWidget
{
    Q_OBJECT
    
public:
    ParentWindow(WId id)
    {
        create(id);
    }
};


При запуске появляется пустое окно. Хотя, по идее, оно должно содержать кнопку (или быть кнопкой). 
Кто-нибудь знает как посадить на QWidget окошко через его идентификатор в x11?

Автор: babutta 28.5.2013, 12:06
 Проблему удалось решить так:
Код

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

    Display* display = XOpenDisplay(NULL);

    XSynchronize(display, True);
    XSetErrorHandler(myErrorHandler);

    Window x11root = XDefaultRootWindow(display);

    int x = 500;
    int y = 500;
    unsigned int width = 150;
    unsigned int height = 150;
    unsigned int borderWidth = 0;
    long colorBlue = 0xff0000ff;

    Window x11w = XCreateSimpleWindow(display, x11root, x, y, 
        width, height, borderWidth, 1 /*magic number*/, colorBlue);

    QWidget w;
    w.resize(300, 300);
    w.show();

    XReparentWindow(display, x11w, w.winId(), 0, 0);
    XMapWindow(display, x11w); // должно быть отработано после вызова XReparentWindow, 
                               // иначе x-окна окна невидно.

    return a.exec();
}


Вот так это выглядит:
http://s1.ipicture.ru/uploads/20130528/xngSEeIq.png

Решить задачу через ParentWindow, можно сказать, не получилось - xwindow встраивается в QWidget, но возникают проблемы при изменении размеров окна и оно не хочет закрываться =)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)