在PyQt5中嵌入终端

时间:2018-08-22 21:52:08

标签: python-3.x pyqt5 qprocess

因此,我一直在尝试创建自己的终端,但是事实证明,该终端非常故障且不专业。

然后我偶然发现了用于PyQt4的这段代码:

#!/usr/bin/env python
#-*- coding:utf-8 -*-

import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *


class embterminal(QWidget):

    def __init__(self):
        QWidget.__init__(self)
        self.process = QProcess(self)
        self.terminal = QWidget(self)
        layout = QVBoxLayout(self)
        layout.addWidget(self.terminal)
        #self.process.start(
                #'xterm',['-into', str(self.terminal.winId())])
        # Works also with urxvt:
        self.process.start(
                'urxvt',['-embed', str(self.terminal.winId())])


if __name__ == "__main__":
    app = QApplication(sys.argv)
    main = embterminal()
    main.show()
    sys.exit(app.exec_())

由于我的应用程序是用PyQt5编写的,所以我自然尝试将代码移植到PyQt5。 我将from PyQt4.QtCore import * from PyQt4.QtGui import *更改为from PyQt5.QtCore import * from PyQt5.QtGui import *,并添加了from PyQt5.QtWidgets import *

然后,当我运行代码时,我意识到终端没有弹出。

我想知道为什么会发生这种情况,并且有解决方法吗?

我还想知道是否可以在同一项目/文件中同时使用PyQt5和PyQt4。

1 个答案:

答案 0 :(得分:1)

在PyQt5中。如果将其转换为整数,则winId()返回<sip.voidptr object at 0x7ff710025aa8> ,它将起作用。

这是工作代码:

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *


class embterminal(QWidget):

    def __init__(self):
        QWidget.__init__(self)
        self.process = QProcess(self)
        self.terminal = QWidget(self)
        layout = QVBoxLayout(self)
        layout.addWidget(self.terminal)

        # Works also with urxvt:
        self.process.start(
                'urxvt',['-embed', str(int(self.winId()))])
        print(self.winId())
        self.setGeometry(1, 1, 800, 600)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    main = embterminal()
    main.show()
    sys.exit(app.exec_())