PyQt4 将派生自另一个自定义小部件的自定义小部件添加到布局
PyQt4 Adding a custom widget derived from another custom widget to layout
我正在尝试构建一个小部件结构,该结构将具有一个派生自 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 是工具栏 object,它它内部有一组小部件,这些小部件派生自 TurquoiseWidget 或基本小部件。
所以当我做的时候
some_widget = ArmControlWidget()
some_widget.show()
它工作得很好。但是当我在工具栏小部件内部创建此小部件并将其显示在那里时,没有任何显示。
对不起,如果我不清楚。提前致谢!
没有子项的小部件的最小尺寸是多少?您可以非常小,当您将其设置为固定大小时,即使您有其他小部件或布局,小部件也将具有小尺寸。所以解决方案是删除行 self.setFixedSize(self.minimumSize())
并添加到 StatusToolbar
self.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
我正在尝试构建一个小部件结构,该结构将具有一个派生自 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 是工具栏 object,它它内部有一组小部件,这些小部件派生自 TurquoiseWidget 或基本小部件。
所以当我做的时候 some_widget = ArmControlWidget() some_widget.show() 它工作得很好。但是当我在工具栏小部件内部创建此小部件并将其显示在那里时,没有任何显示。
对不起,如果我不清楚。提前致谢!
没有子项的小部件的最小尺寸是多少?您可以非常小,当您将其设置为固定大小时,即使您有其他小部件或布局,小部件也将具有小尺寸。所以解决方案是删除行 self.setFixedSize(self.minimumSize())
并添加到 StatusToolbar
self.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