使用gstreamer定位Qt子窗口小部件

时间:2010-08-26 08:49:46

标签: qt4 gstreamer

我有一个以xvimagesink元素结尾的gstreamer管道。要让视频显示在特定的窗口中,我可以使用x_oerlay_interface:

gst_x_overlay_set_xwindow_id(GST_X_OVERLAY(xvsink), winid);

到目前为止,这么好。但是,它只适用于winid是顶级窗口的想法,而不是子窗口小部件的情况。假设我有:

  1. 对话框小部件DialogWidget
  2. 视频小部件VideoWidget,它是DialogWidget的子节点。
  3. 如果我使用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 个答案:

答案 0 :(得分:3)

它实际上与QWidget一起使用。但是,需要调用QApplication::syncX AFTER 致电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);