如何在没有QProcess的情况下将终端嵌入PyQt5应用程序?

时间:2018-09-11 06:33:25

标签: python python-3.x pyqt pyqt5 qtabwidget

我最近一直在努力将终端嵌入PyQt GUI应用程序中。在Internet上几乎尝试了所有搜索,但似乎没有任何帮助。

我有一个QTabWidget,我只需要一个选项卡就可以拥有一个终端。

完全不可能这样做吗?

是否没有诸如QTabWidget.Tab2.show(terminal-app)之类的东西,并且默认终端显示在tab2中,并且诸如lsifconfigcd之类的每个功能都能正常工作?

P.S-我已经尝试过这些方法,但没有成功。 Embedding a terminal in PyQt5

(此处将代码从PyQt4转换为PyQt5,但这不能满足我的需求)how to use a terminal embedded in a PyQt GUI

T.I.A

2 个答案:

答案 0 :(得分:1)

简短答案: Qt5不提供终端的使用,因此您必须使用QProcess。

TL; DR

作为解决方案提出的EmbTerminal类是一个小部件,因此必须使用addTab()添加它,请记住,必须已经安装了urxvt终端(如果要检查安装情况)在终端中运行urxvt

import sys
from PyQt5 import QtCore, QtWidgets


class EmbTerminal(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(EmbTerminal, self).__init__(parent)
        self.process = QtCore.QProcess(self)
        self.terminal = QtWidgets.QWidget(self)
        layout = QtWidgets.QVBoxLayout(self)
        layout.addWidget(self.terminal)
        # Works also with urxvt:
        self.process.start('urxvt',['-embed', str(int(self.winId()))])
        self.setFixedSize(640, 480)


class mainWindow(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super(mainWindow, self).__init__(parent)

        central_widget = QtWidgets.QWidget()
        lay = QtWidgets.QVBoxLayout(central_widget)
        self.setCentralWidget(central_widget)

        tab_widget = QtWidgets.QTabWidget()
        lay.addWidget(tab_widget)

        tab_widget.addTab(EmbTerminal(), "EmbTerminal")
        tab_widget.addTab(QtWidgets.QTextEdit(), "QTextEdit")
        tab_widget.addTab(QtWidgets.QMdiArea(), "QMdiArea")


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

答案 1 :(得分:0)

几个月来我遇到了同样的问题,而urxvt或xterm解决方案对我来说并没有解决问题,因此我创建了一个回购协议,在其中为PyQt5开发易于嵌入的终端。 它适用于某些命令,但对于诸如python之类的命令,它很难写入到正在运行的进程中。

随时贡献力量! https://github.com/Fuchsiaff/PyQtTerminal