PyQt4将从另一个自定义小部件派生的自定义小部件添加到layou

2024-09-29 02:15:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试构建一个小部件结构,它将有一个从QtGui.QWidget派生的基本小部件,然后我将把我想要的基本特性放在我创建的每个小部件中。完成基本小部件后,我将创建从基本小部件派生的其他类型的小部件

下面是一个例子

class TurquoiseWidget(QtGui.QWidget):
    def __init__(self, title="Widget", enable_title=False, font_size=9):
        super(TurquoiseWidget, self).__init__()
        self.setFixedSize(self.minimumSize())
        self.widget_area = QtGui.QFrame()
        self.widget_area.setFrameShape(QtGui.QFrame.Box)
        self.widget_area.setFrameShadow(QtGui.QFrame.Sunken)

        title_lbl = QtGui.QLabel(title)
        font = title_lbl.font()
        font = QtGui.QFont()
        # font.setFamily("Quicksand")
        font.setPointSize(font_size)
        title_lbl.setFont(font)
        title_lyt = QtGui.QHBoxLayout()
        title_lyt.setAlignment(QtCore.Qt.AlignCenter)
        title_lyt.addWidget(title_lbl)


        main_lyt = QtGui.QVBoxLayout()
        main_lyt.setAlignment(QtCore.Qt.AlignTop)
        if enable_title:
            main_lyt.addLayout(title_lyt)
        main_lyt.addWidget(self.widget_area)
        self.setLayout(main_lyt)



class ArmControlWidget(TurquoiseWidget):
    def __init__(self):
        super(ArmControlWidget, self).__init__()
        self.arm_button = QtGui.QPushButton("Arm")
        self.disarm_button = QtGui.QPushButton("Disarm")
        self.arm_button.clicked.connect(lambda: self.Arm(True))
        self.disarm_button.clicked.connect(lambda: self.Arm(False))
        self.srv = rospy.ServiceProxy("/mavros/cmd/arming", CommandBool)

        lyt = QtGui.QHBoxLayout()
        lyt.setAlignment(QtCore.Qt.AlignRight)
        lyt.addWidget(self.disarm_button)
        lyt.addWidget(self.arm_button)
        self.widget_area.setLayout(lyt)

    def Arm(self, arm):
        srv_msg = CommandBoolRequest()
        srv_msg.value = arm
        print self.srv(srv_msg)




class StatusToolbar(TurquoiseWidget):
    """docstring for StatusToolbar."""
    def __init__(self):
        super(StatusToolbar, self).__init__()
        self.lyt = QtGui.QGridLayout()
        self.a = ArmControlWidget()
        self.lyt.addWidget(self.a)
        # self.lyt.addWidget(ArmControlWidget())
        self.widget_area.setLayout(self.lyt)

在本例中,TurquoiseWidget是基本小部件(每个基本小部件中都有一个框架和一个标题标签),ArmControlWidget是执行特定任务的小部件,StatusToolbar是toolbar对象,其中包含一组从TurquoiseWidget或基本小部件派生的小部件

所以当我这么做的时候 some\u widget=ArmControlWidget() 某个\u widget.show() 它工作得很好。但是当我在toolbar小部件中创建这个小部件并在其中显示它时,什么都没有显示

对不起,我不清楚。提前谢谢


Tags: selftitleinitmain部件buttonareawidget
1条回答
网友
1楼 · 发布于 2024-09-29 02:15:49

没有子部件的小部件的最小大小是多少?你可以非常小,当你设置为一个固定大小的小部件将有一个小尺寸,即使你有其他小部件或布局。因此,解决方案是删除行self.setFixedSize(self.minimumSize()),并将其添加到StatusToolbarself.setFixedSize(self.sizeHint())的构造函数的末尾

class TurquoiseWidget(QtGui.QWidget):
    def __init__(self, title="Widget", enable_title=False, font_size=9):
        super(TurquoiseWidget, self).__init__()
        # self.setFixedSize(self.minimumSize()) delete this line
        self.widget_area = QtGui.QFrame()
        # ...

# ...

class StatusToolbar(TurquoiseWidget):
    """docstring for StatusToolbar."""
    def __init__(self):
        super(StatusToolbar, self).__init__()
        self.lyt = QtGui.QGridLayout()
        self.a = ArmControlWidget()
        self.lyt.addWidget(self.a)
        self.widget_area.setLayout(self.lyt)
        self.setFixedSize(self.sizeHint()) # add this line

相关问题 更多 >