Встраивание терминала в PyQt5

Итак, я пытался создать свой собственный терминал, но это оказалось очень глючным и не профессиональным.

Затем я наткнулся на этот код для 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 в одном проекте/файле.


person Community    schedule 22.08.2018    source источник


Ответы (1)


В PyQt. QWidget.winId() возвращает объект sip.voidptr, но если вы преобразуете его в целое число, он должен работать. Вот рабочий пример:

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

class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.process = QProcess(self)
        self.terminal = QWidget(self)
        layout = QVBoxLayout(self)
        layout.addWidget(self.terminal)
        wid = str(int(self.terminal.winId()))
        self.process.start('urxvt', ['-embed', wid])

    def closeEvent(self, event):
        self.process.terminate()
        self.process.waitForFinished(1000)

if __name__ == "__main__":

    app = QApplication(sys.argv)
    window = Window()
    window.setGeometry(100, 100, 800, 600)
    window.show()
    sys.exit(app.exec_())
person Community    schedule 23.08.2018
comment
Я получаю простой графический интерфейс без каких-либо опций. Это нормально? Как я могу получить нормальный терминал в моем приложении PyQt5? - person v1h5; 11.09.2018
comment
Можно ли изменить размер embTerminal для любого resizeEvent (self.resizeEvent, если нет родителя, или parent.resizeEvent, если он находится в каком-то контейнере)? - person Dušan Atanacković; 11.02.2019
comment
У меня тоже была эта проблема, и это основная причина, по которой я начал разрабатывать свой собственный виджет терминала github.com/Fuchsiaff/ PyQtтерминал - person ; 14.02.2019
comment
Я просмотрел ваш код, но информации об использовании нет (я оставил проблему); как его предполагается использовать? - person ZioByte; 06.08.2019