2016-12-08 4 views
0

Ich versuche, einen Knoteneditor mit pyqt und Probleme beim Hinzufügen von Knoten in Echtzeit.Knoteneditor, Hinzufügen von Kind QWidget ein anderes QWidget zur Laufzeit

Wenn ich einen Knoten bei der Initialisierung des NodeEditor QWidget hinzufügen, funktioniert es gut, aber wenn ich einen Knoten mit einem Rechtsklick-Menü hinzufügen passiert nichts, irgendeine Idee, was ich falsch mache?

import sys 
from PyQt4 import QtCore, QtGui, uic 

class Node(QtGui.QWidget): 
    def __init__(self,parent=None): 
     QtGui.QWidget.__init__(self,parent) 
     widLwayout = QtGui.QVBoxLayout() 
     self.setLayout(widLwayout) 

     self.frame = QtGui.QFrame() 
     self.frameLayout = QtGui.QVBoxLayout() 
     self.frame.setLayout(self.frameLayout) 
     self.frame.setStyleSheet("background-color: rgb(220, 220, 220)") 

     widLwayout.addWidget(self.frame) 

    def mousePressEvent(self, event): 
     self.__mousePressPos = None 
     self.__mouseMovePos = None 
     if event.button() == QtCore.Qt.LeftButton: 
      self.__mousePressPos = event.globalPos() 
      self.__mouseMovePos = event.globalPos() 
     super(Node, self).mousePressEvent(event) 

    def mouseMoveEvent(self, event): 
     if event.buttons() == QtCore.Qt.LeftButton: 
      currPos = self.mapToGlobal(self.pos()) 
      globalPos = event.globalPos() 
      diff = globalPos - self.__mouseMovePos 
      newPos = self.mapFromGlobal(currPos + diff) 
      self.move(newPos) 
      self.__mouseMovePos = globalPos 
     super(Node, self).mouseMoveEvent(event) 

    def mouseReleaseEvent(self, event): 
     if self.__mousePressPos is not None: 
      moved = event.globalPos() - self.__mousePressPos 
      if moved.manhattanLength() > 3: 
       event.ignore() 
       return 
     super(Node, self).mouseReleaseEvent(event) 

class Hosts(Node): 
    def __init__(self, parent=None): 
     Node.__init__(self,parent) 
     self.resize(150,100) 
     title = QtGui.QLabel("Hosts") 
     getAssigned = QtGui.QRadioButton("Assigned") 
     getHostNames = QtGui.QRadioButton("Host Names") 
     getHostNames.setLayoutDirection(QtCore.Qt.RightToLeft) 

     self.frameLayout.addWidget(title) 
     self.frameLayout.addWidget(getAssigned) 
     self.frameLayout.addWidget(getHostNames) 


class NodeEditor(QtGui.QWidget): 
    def __init__(self): 
     QtGui.QMainWindow.__init__(self) 
     self.resize(640,480) 

     self.nodes = [] 
     self.nodes.append(Hosts(self)) 

     self.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) 
     self.customContextMenuRequested.connect(self.contextMenuEvent) 
     self.buildMenu() 

    def buildMenu(self): 
     self.menu = QtGui.QMenu(self) 

     self.addHosts = QtGui.QAction('Add Hosts', self) 
     self.addHosts.triggered.connect(self.addHostsTrigger) 
     self.menu.addAction(self.addHosts) 

    def contextMenuEvent(self, event): 
     self.menu.popup(QtGui.QCursor.pos()) 

    def addHostsTrigger(self): 
     self.nodes.append(Hosts(self)) 

if __name__=="__main__": 
    app = QtGui.QApplication(sys.argv) 
    wnd = NodeEditor() 
    wnd.show() 
    sys.exit(app.exec_()) 

Jede Hilfe wird geschätzt.

Danke, Mark

Antwort

1

hinzufügen host.show() auf addHostsTrigger:

def addHostsTrigger(self): 
    host = Hosts(self) 
    host.show() 
    self.nodes.append(host) 

In Ihrem Code:

import sys 
from PyQt4 import QtCore, QtGui 


class Node(QtGui.QWidget): 
    def __init__(self, parent=None): 
     QtGui.QWidget.__init__(self, parent) 
     widLwayout = QtGui.QVBoxLayout() 
     self.setLayout(widLwayout) 

     self.frame = QtGui.QFrame() 
     self.frameLayout = QtGui.QVBoxLayout() 
     self.frame.setLayout(self.frameLayout) 
     self.frame.setStyleSheet("background-color: rgb(220, 220, 220)") 

     widLwayout.addWidget(self.frame) 

    def mousePressEvent(self, event): 
     self.__mousePressPos = None 
     self.__mouseMovePos = None 
     if event.button() == QtCore.Qt.LeftButton: 
      self.__mousePressPos = event.globalPos() 
      self.__mouseMovePos = event.globalPos() 
     super(Node, self).mousePressEvent(event) 

    def mouseMoveEvent(self, event): 
     if event.buttons() == QtCore.Qt.LeftButton: 
      currPos = self.mapToGlobal(self.pos()) 
      globalPos = event.globalPos() 
      diff = globalPos - self.__mouseMovePos 
      newPos = self.mapFromGlobal(currPos + diff) 
      self.move(newPos) 
      self.__mouseMovePos = globalPos 
     super(Node, self).mouseMoveEvent(event) 

    def mouseReleaseEvent(self, event): 
     if self.__mousePressPos is not None: 
      moved = event.globalPos() - self.__mousePressPos 
      if moved.manhattanLength() > 3: 
       event.ignore() 
       return 
     super(Node, self).mouseReleaseEvent(event) 


class Hosts(Node): 
    def __init__(self, parent=None): 
     Node.__init__(self, parent) 
     self.resize(150, 100) 
     title = QtGui.QLabel("Hosts") 
     getAssigned = QtGui.QRadioButton("Assigned") 
     getHostNames = QtGui.QRadioButton("Host Names") 
     getHostNames.setLayoutDirection(QtCore.Qt.RightToLeft) 

     self.frameLayout.addWidget(title) 
     self.frameLayout.addWidget(getAssigned) 
     self.frameLayout.addWidget(getHostNames) 


class NodeEditor(QtGui.QWidget): 
    def __init__(self): 
     QtGui.QMainWindow.__init__(self) 
     self.resize(640, 480) 
     self.buildMenu() 
     self.nodes = [] 
     self.addHostsTrigger() 
     self.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) 
     self.customContextMenuRequested.connect(self.contextMenuEvent) 

    def buildMenu(self): 
     self.menu = QtGui.QMenu(self) 
     self.addHosts = QtGui.QAction('Add Hosts', self) 
     self.addHosts.triggered.connect(self.addHostsTrigger) 
     self.menu.addAction(self.addHosts) 

    def contextMenuEvent(self, event): 
     self.menu.popup(QtGui.QCursor.pos()) 

    def addHostsTrigger(self): 
     host = Hosts(self) 
     host.show() 
     self.nodes.append(host) 
+0

Dank Eyllanesc, kann es nicht glauben, dass einfach war .. :) – Mark