QtDesigner (SourceForm, DestinationForm)에 두 개의 창을 작성하고 pyuic5를 사용하여 .ui 페이지를 변환했습니다. 누적 위젯을 사용하여 두 창 사이를 탐색하는 방법으로 세 번째 클래스 WController
을 사용하고 있습니다. 어떤 데이터로 treeWidget
을 채우는 SourceForm
버튼이 있고 handle_treewidget_itemchange
메서드는 의 특정 항목이 self.treeWidget.itemChanged.connect(self.handle_treewidget_itemchange)
을 사용하여 선택되거나 선택 취소되면 어떻게되는지를 나타냅니다.PyQt5 초보자 - 신호 및 누락 된 위치 인수
TypeError: handle_treewidget_itemchange() missing 2 required positional arguments: 'row' and 'col'
내가 꺼내 경우 그것은 itemChanged.connect
자동으로 슬롯으로 변경되었지만 handle_treewidget_itemchange(self,row,col)
가 처음으로 호출 될 때, 내 스크립트가 형식 오류와 충돌이 있었는지의 행과 열을 보내는 것이 나의 이해했다 row
및 col
args이면 스크립트가 정상적으로 실행됩니다. 원래 두 메서드와 호출을 SourceForm
.py 파일 자체에 넣었을 때 코드가 의도 한대로 작동했습니다 ... 아마도 이것은 범위 문제일까요? 사용하는 경우
from PyQt5 import QtCore, QtWidgets
from PyQt5.QtCore import pyqtSlot
from imp_sourceform import Ui_SourceForm
from imp_destform import Ui_DestinationForm
class WController(QtWidgets.QMainWindow):
def __init__(self, parent=None):
super(WController, self).__init__(parent)
self.central_widget = QtWidgets.QStackedWidget()
self.setCentralWidget(self.central_widget)
self.sourcewindow = SourceForm()
self.destinationwindow = DestinationForm()
self.central_widget.addWidget(self.sourcewindow)
self.central_widget.addWidget(self.destinationwindow)
self.central_widget.setCurrentWidget(self.sourcewindow)
self.sourcewindow.selectdestinationsbutton.clicked.connect(lambda: self.navigation_control(1))
self.destinationwindow.backbutton.clicked.connect(lambda: self.navigation_control(0))
def navigation_control(self, topage):
if topage == 1:
self.central_widget.setCurrentWidget(self.destinationwindow)
elif topage == 0:
self.central_widget.setCurrentWidget(self.sourcewindow)
class SourceForm(QtWidgets.QWidget, Ui_SourceForm):
def __init__(self):
super(SourceForm, self).__init__()
self.setupUi(self)
self.treeWidget.itemChanged.connect(self.handle_treewidget_itemchange)
@pyqtSlot()
def handle_treewidget_itemchange(self,row,col):
if row.parent() is None and row.checkState(col) == QtCore.Qt.Unchecked:
for x in range(0,row.childCount()):
row.child(x).setCheckState(0, QtCore.Qt.Unchecked)
elif row.parent() is None and row.checkState(col) == QtCore.Qt.Checked:
for x in range(0,row.childCount()):
row.child(x).setCheckState(0, QtCore.Qt.Checked)
else:
pass
class DestinationForm(QtWidgets.QWidget, Ui_DestinationForm):
def __init__(self):
super(DestinationForm, self).__init__()
self.setupUi(self)
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
window = WController()
window.show()
sys.exit(app.exec_())
pyqtSlot 실제 Qt는 슬롯을 만듭니다
는 하나 개의 연결 또는 기타를 활성화 할 수 있습니다,이 코드를 참조하고, 윈도우가 가비지 수집 여부가 될 수 있는지 여부를 보여줍니다 행동의 차이를 관찰 슬롯이있는 QObject가 파괴되거나 가비지 수집 될 때 연결이 끊어집니다 (Qt는 삭제 된 QObject에서 연결을 끊습니다). 내가 틀렸다고 정정하되'@ pyqtSlot'을 사용하지 않는다면 연결은 QObject를 추적 할 수 없으므로 호출 가능 객체에 대한 참조를 유지하고 QObject에 대한 참조를 유지하여 파괴. IMHO 가능할 때마다'@ pyqtSlot'을 사용하는 것이 더 좋습니다 –
오 세상에, 당황 스럽네요, 지금 작동 중입니다! 정말 고맙습니다! '@pyqtSlot()'데코레이터를 사용하고 있었기 때문에 슬롯을 쉽게 찾을 수있었습니다. 나는 (위험하게) 그 형태로 양성이라고 생각했다. 원래'handle_treewidget_itemchange' 메서드와 그것의 connect 문을'SourceForm'에 넣었습니다. (일단 GUI를 조정하기를 원했을 때 나는 빨리 배웠습니다.) 슬롯은 행과 열의 인수를'pyqtslot '데코레이터 그대로 ... 그래서 나는 결코 그것을 잠재적 인 문제 해결로 생각하지 않았습니다. –
저는 방금 말한 것을 테스트했습니다 : 실제 슬롯에 연결하는 http://pastebin.com/W5tFkWGL은 "호출 가능"슬롯을 사용하는 것과 달리 참조 계산을 방해하지 않습니다. 그래서, 나는 "모든 호출 가능"을'connect '에 대한 타겟으로 사용하는 것은 나쁜 아이디어라고 생각합니다. 가능한 한 피해야하며, pyqtSlot으로 바꾸어야합니다. –