2013-05-23 1 views
1

Существует приложение Qt. GL-окно, созданное в этом приложении, вызывая функцию XCreateWindow, и я не могу ее редактировать. Мне нужно поставить Xwindow в QWidget внутри моих приложений Qt.Окно X11 не помещается в QWidget для встраивания в приложение Qt

В документации:

void QWidget::create (WId window = 0, bool initializeWindow = true, 
    bool destroyOldWindow = true) [protected] 

Создает новое окно виджета, если окно 0, в противном случае устанавливает окно виджета s в window.Initializes окно задает геометрию и т.д.), если initializeWindow верно. Если initializeWindow является ложным, инициализация не выполняется. Этот параметр имеет смысл только в том случае, если окно является допустимым окном.

...

Для проверки результата функции QWidget :: создать там следующий код:

class ParentWindow : public QWidget 
{ 
    Q_OBJECT 

    public: 
    ParentWindow(WId id) 
    { 
    create(id); 
    } 
}; 

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

Когда приложение запуска одиночного пустое окно появляется. Хотя ожидаемое окно содержит кнопку (или кнопку). Как я могу поместить окно X11 в свой QWidget?

ответ

-1

Вы не должны касаться идентификаторов окон в своей первой программе Qt. Идентификаторы окон представляют собой концепцию низкого уровня, и программист Qt обычно нуждается в них только для того, чтобы что-то делать вне рамки Qt. Управление виджетами как дочерними элементами других виджетов - не такая задача.

Я рекомендую вам начать с одного из tutorials. Посмотрите, в частности, here, чтобы увидеть, как вы создаете виджет ребенка другого виджета.

+0

Спасибо, но дело в том, что мне нужно x-окно, встроенное в QWidget. Это точно мой вопрос. – babutta

+0

Ваши объяснения сбивают с толку. Вы, похоже, хотите создать виджет Qt и поместить в него кнопку Qt, тогда вы хотите сделать что-то еще. Не совсем ясно, что именно. Вы хотите повторно отобразить существующее окно toplevel X11 и сделать его дочерним элементом нового окна виджета Qt? –

+0

Да, я хочу это сделать. Извините меня за смутное объяснение. Мой английский недостаточно хорош =) – babutta

0

Проблема была решена:

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); // must be performed after XReparentWindow, 
           // otherwise the window is not visible. 

    return a.exec(); 
} 

Чтобы решить эту проблему с помощью виджета ParentWindow не удалось - Xwindow встраивается в QWidget, но есть проблемы с изменением размера окна и его закрытия (не закрывает).

0

Позвольте Qt создать ваше окно, а затем использовать Qt X11 Drawable с кодом X11/GL.

С OpenGL и Qt вы должны использовать Qt OpenGL-контекст, если Qt - рендеринг с использованием OpenGL. Просто имейте в виду, что Qt ожидает, что состояние OpenGL будет возвращено к тому, что было, когда оно в последний раз его использовало.

Вы можете получить доступ к Drawable с помощью QX11Info (также проверьте Compiler does not see QX11Info, так как это охватывает общую проблему при включении X11 с Qt).

Способ Qt обеспечивает доступ как к X11, так и к OpenGL, кажется, изменяется между основными и второстепенными версиями, поэтому вам может понадобиться немного поработать.

Я знаю, что вышеупомянутое работает с Qt5.1 до 5.5. Qt5.6 имеет проблемы с этим подходом, которые я еще не решил.

Смежные вопросы