Встраивание терминала в 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 в одном проекте / файле, даже.

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_())
Другие вопросы по тегам