Встраивание терминала в 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_())