Run an active window inside an PyQT5 GUI applicati

2019-08-23 03:06发布

问题:

I'm using PyQT5, and I want to run an external window inside an TabWidget, something similar to that, but this example is for windows only, and i want to run in a linux (Ubuntu 14.04) os. I also find a similar problem in this thread but the answers didn't work. Also tried the solution here but didn't work either. Is possible to embed an terminal, like this code, but i have no idea how to do the same with the RViz command. I have some code bellow, who uses wmctrl to pick the RViz (the application that i want to embed in my GUI) window ID, and try to put inside the "fromWinID()" class, but the window opens outside my app and also receive the error:

QXcbConnection: XCB error: 3 (BadWindow), sequence: 415, resource id: -1222189812, major code: 7 (ReparentWindow), minor code: 0
QXcbConnection: XCB error: 3 (BadWindow), sequence: 460, resource id: -1222189812, major code: 7 (ReparentWindow), minor code: 0
QXcbConnection: XCB error: 3 (BadWindow), sequence: 461, resource id: -1222189812, major code: 8 (MapWindow), minor code: 0
QXcbConnection: XCB error: 3 (BadWindow), sequence: 463, resource id: -1222189812, major code: 18 (ChangeProperty), minor code: 0
QXcbConnection: XCB error: 3 (BadWindow), sequence: 464, resource id: -1222189812, major code: 12 (ConfigureWindow), minor code: 0

Can someone help with that please?

# -*- coding: utf-8 -*-
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
import subprocess
from subprocess import call, Popen, PIPE, check_output

class Container(QtWidgets.QTabWidget):
    def __init__(self):
        QtWidgets.QTabWidget.__init__(self)
        rvizCommand = 'rviz'
        # Using Popen instead of Call to dont block the process
        subprocess.Popen(rvizCommand, stdout=PIPE,
                         stdin=PIPE, shell=True)
        # wmctrl to find the active hexadecimal   
        lookForID = "wmctrl -l | grep -i RViz | awk '{print $1}'"
        rvizID = subprocess.check_output(lookForID, shell=True)
        rvizID = str(rvizID.rstrip("\n"))
        print(rvizID)
        window = QtGui.QWindow.fromWinId(rvizID)
        container = QtWidgets.QWidget.createWindowContainer(window, self)               
        self.addTab(container, 'RViz')

app = QtWidgets.QApplication(sys.argv)
rviz = Container()
rviz.show()
sys.exit(app.exec_())