首页 > 解决方案 > 将 Qwidgest 动态添加到 QGroupbBox

问题描述

我想动态地将 QLabel 之类的 QWidgets 添加到 QGroupBox 中。并且 groupbox 的布局不应该设置为绝对定位(我不想要布局)。如果在将 Qgroupbox 添加到 MainWindow 布局之前将 QWidget 添加到 QGroupBox,它会起作用并显示在窗口上。当我尝试像 addWidget 函数中显示的那样动态添加 Qlabel 之类的 QWidget 时,它不会显示小部件。我错过了一点吗?

 class DropableGroupBox(QtWidgets.QGroupBox):
    def __init__(self,*args):
        super().__init__(*args)
        self.setAcceptDrops(True)

    def dragEnterEvent(self, event):
        if event.mimeData().hasText():
            event.acceptProposedAction()

    def dropEvent(self, event):
        pos = event.pos()
        text = event.mimeData().text()
        event.acceptProposedAction()


class ResultWindow(DropableGroupBox):
    def __init__(self,*args):
        super().__init__(*args)
        self.groupBox  = QtWidgets.QGroupBox()
        self.groupBox.setStyleSheet("background-color:yellow;")
        #labelx = DraggableLabel("Label", self.groupBox)

        vLay = QtWidgets.QVBoxLayout()
        vLay.addWidget(self.groupBox)
        self.setLayout(vLay)

    def dropEvent(self, event):
        text = event.mimeData().text()
        Curpos =self.mapFromGlobal(QtGui.QCursor().pos()) 
        self.addWidget(text,Curpos)
        event.acceptProposedAction()

    def addWidget(self,text,pos):
        if text=="label":
            labelx = DraggableLabel("Label",self)
            labelx.move(50,50)
            labelx.setStyleSheet("background-color:red")
            print("Here is")

标签: python-3.xpyqt5

解决方案


你错过了两件重要的事情:

  • 如果您想在不使用布局管理器的情况下添加小部件,则必须设置父小部件(可能在构造函数中),否则它将被视为顶级小部件,并将与自己的窗口一起显示;
  • 如果小部件添加到布局管理器中,则必须显式显示它,如果它没有父级,或者父级已经显示(如您的情况);
    def addWidget(self,text,pos):
        if text=="label":
            labelx = DraggableLabel("Label", self)
            labelx.move(50,50)
            labelx.setStyleSheet("background-color:red")
            labelx.show()

推荐阅读