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

How to embed terminal inside PyQt5 application without QProcess?

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

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

完全不可能这样做吗?

难道没有 QTabWidget.Tab2.show(terminal-app) 之类的东西,默认终端显示在 tab2 中,并且 lsifconfigcd 等每个功能都可以正常工作吗?

P.S - 我已经尝试过这些但没有成功。

(将此处的代码从 PyQt4 转换为 PyQt5,但这不能满足我的需求)

T.I.A

简答:Qt5不提供终端的使用,所以你将不得不使用QProcess。

TL;DR

作为解决方案提出的 EmbTerminal class 是一个小部件,因此您必须使用 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_())

几个月来我一直遇到同样的问题,urxvt 或 xterm 解决方案不适合我,所以我创建了一个 repo,我正在为 PyQt5 开发一个易于嵌入的终端。 它适用于某些命令,但对于像 python 这样的命令,它在写入 运行 进程时遇到问题。

随时投稿! https://github.com/Fuchsiaff/PyQtTerminal