【问题标题】:Node editor, adding child QWidget another QWidget at run time节点编辑器,在运行时添加子 QWidget 另一个 QWidget
【发布时间】:2016-12-08 14:19:28
【问题描述】:

我正在尝试使用 pyqt 制作节点编辑器,但无法实时添加节点。

如果我在 NodeEditor QWidget 的初始化时添加一个节点,它可以正常工作,但如果我使用右键菜单添加一个节点,则没有任何反应,知道我做错了什么吗?

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_())

任何帮助将不胜感激。

谢谢, 标记

【问题讨论】:

    标签: python python-2.7 pyqt pyqt4


    【解决方案1】:

    addHostsTrigger 上添加host.show()

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

    在您的代码中:

    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)
    

    【讨论】:

    • 感谢 Eyllanesc,简直不敢相信它是如此简单.. :)
    猜你喜欢
    • 2020-07-09
    • 1970-01-01
    • 2014-11-03
    • 2020-10-14
    • 2018-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-04
    相关资源
    最近更新 更多