Ориентация дочернего виджета Qt с помощью gstreamer - PullRequest
0 голосов
/ 26 августа 2010

У меня есть конвейер gstreamer, который заканчивается элементом xvimagesink. Чтобы видео отображалось в определенном окне , я могу использовать x_oerlay_interface:

gst_x_overlay_set_xwindow_id(GST_X_OVERLAY(xvsink), winid);

Пока все хорошо. Тем не менее, это работает, только если winid является идеей окна верхнего уровня, что не относится к дочерним виджетам. Допустим, у меня есть:

  1. Диалоговый виджет DialogWidget
  2. Видео-виджет VideoWidget, который является дочерним для DialogWidget.

Если я использую DialogWidget->winId(), видео отображается правильно.
Если я использую 'VideoWidget-> winId ()', то получаю сообщение от расширения Xv, сообщающее мне что-то вроде

X Error: BadWindow (invalid Window parameter) 3
  Major opcode: 3 (X_GetWindowAttributes)
  Resource id:  0x40000d5
X Error: BadWindow (invalid Window parameter) 3
  Major opcode: 2 (X_ChangeWindowAttributes)
  Resource id:  0x40000d5
X Error: BadDrawable (invalid Pixmap or Window parameter) 9
  Major opcode: 55 (X_CreateGC)
  Resource id:  0x40000d5
X Error: BadGC (invalid GC parameter) 13
  Extension:    132 (Uknown extension)
  Minor opcode: 19 (Unknown request)
  Resource id:  0x40000d5
X Error: BadGC (invalid GC parameter) 13
  Extension:    132 (Uknown extension)
  Minor opcode: 19 (Unknown request)
  Resource id:  0x40000d5

Я хотел бы иметь окно с изменяемым размером с кнопками управления и т. Д., И в этом окне, окно отображения видео или виджет или что-либо, что является подходящей целью для

gst_x_overlay_set_xwindow_id

Как я могу это сделать?

1 Ответ

3 голосов
/ 26 августа 2010

На самом деле он работает с QWidget.Однако требуется вызов QApplication::syncX ПОСЛЕ вызов WinId:

/* Wrong order */
QApplication::syncX();
gst_x_overlay_set_xwindow_id(GST_X_OVERLAY(xvsink), someWidget->winId());

/* Right order */
unsigned long win_id = someWidget->winId();
QApplication::syncX();
gst_x_overlay_set_xwindow_id(GST_X_OVERLAY(xvsink), win_id);
...