首页 > 解决方案 > 如何在 Pyqt5 GUI 中嵌入 URxvt 终端?

问题描述

我在 QtChooser 中构建了一个 GUI,它的代码是用 PyQt5 编写的。我在 GUI 中总共有 7 个选项卡,每个选项卡都在我的代码的 QMainWindow 类中定义。这些定义包含每个 TextEdit、LineEdit、PushButtons、RadioButtons 等的代码。但是,在其中一个选项卡中,我想嵌入一个外部终端,当在该选项卡中单击特定 PushButton 时,该终端将打开。切换 RadioButton 时,我能够打开 Urxvt 终端。我现在面临的问题是专门在 TextEdit 区域打开终端。这就是原始 GUI(内置在 QtDesigner 中的样子。我需要在输出标签下方的 TextEdit 中打开终端。 但是,这是运行代码时终端在 GUI 中打开的方式 这是更新代码的一部分:

from PyQt5 import QtCore, QtGui, QtWidgets, uic
from PyQt5.QtGui import QPixmap
from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QPushButton, QMessageBox, QAction
from PyQt5.QtCore import QDate, QTime, QDateTime, Qt
import sys
import platform
import os
import subprocess
import time
import re
import textwrap

class EmbTerminal(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(EmbTerminal, self).__init__()
        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())), '-bg', '#000000', '-fg', '#ffffff'])
        self.setFixedSize(539, 308)

class Ui_Dialog(QtWidgets.QMainWindow):
    def __init__(self):
        super(Ui_Dialog, self).__init__()
        #Load GUI from QT5 Designer
        uic.loadUi("S1_mainwindow.ui", self)

def openTerminalCheckBox (self):
        if self.openTerminalRMachineRadioButton.isChecked():
            status = True
            self.commandLineRemoteCommandRMachineLineEdit.setDisabled(True)
            self.commandlineRemoteCommandRMachineLabel.setDisabled(True)
            self.executeRemoteCommandRMachinePushButton.setDisabled(True)
            self.remoteMachineOutputLabel.setText("Terminal")

            self.outputRMachineTextEdit = QtWidgets.QTabWidget()
            self.gridLayout_6.addWidget(self.outputRMachineTextEdit)

            self.outputRMachineTextEdit.addTab(EmbTerminal(), "EmbTerminal")
        else:
            status = False
app = QtWidgets.QApplication(sys.argv) # Create an instance of QtWidgets.QApplication
window = Ui_Dialog()
main = mainWindow()
main.show() # Create an instance of our class
app.exec_()

我需要在该选项卡中已经定义的 QTextEdit 中专门打开终端。你们有什么建议/意见吗?

标签: pyqt5embedurxvt

解决方案


推荐阅读