我有一個應用程式,其中我在 QGraphicScene 上有幾個按鈕小部件,我正在嘗試制作這個按鈕小部件,以便在單擊 QGraphicScene 時在 QGraphicScene 上制作新按鈕。
我的代碼如下:
buttons = [] class SeveralButtons(QtWidgets.QWidget): def __init__(self,id,x,y): super(SeveralButtons,self).__init__() self.id = id self.x = x self.y = y self.setGeometry(x,y,1,1) self.button1 = QtWidgets.QPushButton("B1") self.button2 = QtWidgets.QPushButton("B2") self.button1.clicked.connect(self.p1b) self.severalButtonsLayout = QtWidgets.QGridLayout() self.severalButtonsLayout.addWidget(self.button1, 0,0,) self.severalButtonsLayout.addWidget(self.button2, 0,1,) self.setLayout(self.severalButtonsLayout) def p1b(self): ph = SeveralButtons(0,self.x-200,self.y-200) buttons.append(ph) UiWindow._scene.addWidget(ph)
我的主要課程是這樣的:
class UiWindow(QtWidgets.QMainWindow): factor = 1.5 def __init__(self, parent=None): super(UiWindow, self).__init__(parent) self.setFixedSize(940,720) self._scene = QtWidgets.QGraphicsScene(self) self._view = QtWidgets.QGraphicsView(self._scene) self._view.setDragMode(QtWidgets.QGraphicsView.ScrollHandDrag) self._view.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) self._view.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) self.initButtons() self.setCentralWidget(self._view) def initButtons(self): self.p = SeveralButtons(0,500,500) buttons.append(self.p) self._scene.addWidget(self.p) def updateButtons(self,phrase): for b in buttons: if b != buttons[0]: self._scene.addWidgets(b) # ADD BUTTON WIDGET IN buttons ARRAY TO THE _scene OBJECT if __name__ == "__main__": import sys app = QtWidgets.QApplication(sys.argv) ui = UiWindow() ui.show() sys.exit(app.exec_())
如此處所示,我正在嘗試通過單擊按鈕來更新主視窗中的小部件,但QGraphicsProxyWidget::setWidget: cannot embed widget 0x24ac1a93000; already embedded出現錯誤。
我怎樣才能克服這個問題,或者什么是使這項作業正常的方法?我在這個程式中的主要目標是每個按鈕組都可以在單擊時創建它們的子按鈕組。用類來做這件事是可行的,還是在創建遞回小部件時我應該堅持主視窗類中的方法?
提前致謝。
編輯:
class SeveralButtons(QtWidgets.QWidget): b1Signal = QtCore.pyqtSignal() def __init__(): self.button1 = QtWidgets.QPushButton() self.button1.clicked.connect(self.b1) ... def b1(self): sb = SeveralButtons() buttons.append(sb) self.b1Signal.emit() class UiWindow(QtWidgets.QMainWindow): def __init__(): ... self.sb1 = SeveralButtons() buttons.append(sb1) self._scene.addWidget(self.sb1) self.sb1.b1Signal.connect(self.updateButtons) def updateButtons(): for b in buttons: if b != buttons[0]: self._scene.addWidget(b)
uj5u.com熱心網友回復:
該類SeveralButtons不應負責在其自身之外創建新按鈕。
您應該發出該信號并將其連接到其父函式的函式,然后該函式將創建同一類的新實體并連接該信號。
class SeveralButtons(QtWidgets.QWidget):
b1Signal = QtCore.pyqtSignal()
def __init__():
super().__init__()
layout = QtWidgets.QHBoxLayout(self)
self.button1 = QtWidgets.QPushButton()
self.button1.clicked.connect(self.b1Signal)
layout.addWidget(self.button1)
class UiWindow(QtWidgets.QMainWindow):
def __init__():
# ...
self.buttons = []
self.addButtons()
def addButtons():
newButtons = SeveralButtons()
newButtons.b1Signal.connect(self.addButtons)
self.buttons.append(newButtons)
self._scene.addWidget(newButtons)
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/472801.html
上一篇:更有效地設定物件屬性
