PyQt5 添加自定义 QWidget 到 QLayout
PyQt5 add custom QWidget to QLayout
目前我正在尝试将自定义 QWidget class 添加到 QVBoxLayout。我遇到的问题是小部件根本没有出现在布局中。我什至尝试设置 QWidget 的最小尺寸,因为我认为小部件没有显示是因为它的默认尺寸设置为零。
这是 class 的简化形式:
class myWidget(QWidget):
def __init__(self):
super().__init__()
# Slider
self.mySlider = QSlider(Qt.Horizontal)
self.mySlider.setRange(-360, 360)
# LCD Screen
self.lcd = QLCDNumber()
self.lcd.setMinimumHeight(45)
self.lcd.setMaximumHeight(75)
# set Size
self.setMinimumSize(QSize(400,300))
我删除了滑块和 LCD 屏幕之间的信号和插槽,因为我不担心这里的功能。只是我在以下代码中的两个按钮之间直接获得了 QSize(400,300) 的灰色区域:
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
#Create Widgets to be Added to Central Widget
self.w1 = QPushButton("First")
self.w2 = myWidget()
self.w3 = QPushButton("Third")
#Set Central Widget and VBox
self.central_widget = QWidget()
self.setCentralWidget(self.central_widget)
self.layout = QVBoxLayout()
self.central_widget.setLayout(self.layout)
#Add widgets
self.layout.addWidget(self.w1)
self.layout.addWidget(self.w2)
self.layout.addWidget(self.w3)
所以我所做的只是创建 3 个小部件,并将它们放入中央小部件内的 QVBoxLayout 中。出现了 2 个按钮小部件 w1
和 w3
,但我的自定义小部件没有出现,通过 setMinimumSize
增加小部件的大小只会在 w1
和 [= 之间增加灰色间距13=]。
所以小部件在那里,只是由于某种原因不可见。我是 PyQt 的新手,所以请解释为什么会这样。
QWidgets
只是其他小部件的容器。 QWidget
没有任何布局和子窗口小部件 看起来就像空的 space 除非您正在做一些自定义绘画或样式设置。
在您的示例中,您实际上并未向自定义小部件添加任何子小部件。为了将子小部件添加到另一个小部件,您需要设置子小部件的父级,或者将子小部件添加到父小部件的布局(自动重新设置子小部件的父级)
class myWidget(QWidget):
def __init__(self):
super().__init__()
# Slider
self.mySlider = QSlider(Qt.Horizontal)
在这里,您正在创建一个 QSlider
,但它实际上并不属于 MyWidget
,它最终将归 Qt
所有,我希望它是绘制在主 window.
的左上角
为了使其成为 MyWidget
的子窗口小部件,您需要设置父窗口小部件并将其添加到布局中。
class myWidget(QWidget):
def __init__(self):
super().__init__()
self.myLay = QVBoxLayout()
self.setLayout(self.myLay)
# Notice self is being passed in to set the parent
self.mySlider = QSlider(Qt.Horizontal, self)
# You need to add widgets to a layout to position them properly
self.myLay.addWidget(self.mySlider)
目前我正在尝试将自定义 QWidget class 添加到 QVBoxLayout。我遇到的问题是小部件根本没有出现在布局中。我什至尝试设置 QWidget 的最小尺寸,因为我认为小部件没有显示是因为它的默认尺寸设置为零。
这是 class 的简化形式:
class myWidget(QWidget):
def __init__(self):
super().__init__()
# Slider
self.mySlider = QSlider(Qt.Horizontal)
self.mySlider.setRange(-360, 360)
# LCD Screen
self.lcd = QLCDNumber()
self.lcd.setMinimumHeight(45)
self.lcd.setMaximumHeight(75)
# set Size
self.setMinimumSize(QSize(400,300))
我删除了滑块和 LCD 屏幕之间的信号和插槽,因为我不担心这里的功能。只是我在以下代码中的两个按钮之间直接获得了 QSize(400,300) 的灰色区域:
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
#Create Widgets to be Added to Central Widget
self.w1 = QPushButton("First")
self.w2 = myWidget()
self.w3 = QPushButton("Third")
#Set Central Widget and VBox
self.central_widget = QWidget()
self.setCentralWidget(self.central_widget)
self.layout = QVBoxLayout()
self.central_widget.setLayout(self.layout)
#Add widgets
self.layout.addWidget(self.w1)
self.layout.addWidget(self.w2)
self.layout.addWidget(self.w3)
所以我所做的只是创建 3 个小部件,并将它们放入中央小部件内的 QVBoxLayout 中。出现了 2 个按钮小部件 w1
和 w3
,但我的自定义小部件没有出现,通过 setMinimumSize
增加小部件的大小只会在 w1
和 [= 之间增加灰色间距13=]。
所以小部件在那里,只是由于某种原因不可见。我是 PyQt 的新手,所以请解释为什么会这样。
QWidgets
只是其他小部件的容器。 QWidget
没有任何布局和子窗口小部件 看起来就像空的 space 除非您正在做一些自定义绘画或样式设置。
在您的示例中,您实际上并未向自定义小部件添加任何子小部件。为了将子小部件添加到另一个小部件,您需要设置子小部件的父级,或者将子小部件添加到父小部件的布局(自动重新设置子小部件的父级)
class myWidget(QWidget):
def __init__(self):
super().__init__()
# Slider
self.mySlider = QSlider(Qt.Horizontal)
在这里,您正在创建一个 QSlider
,但它实际上并不属于 MyWidget
,它最终将归 Qt
所有,我希望它是绘制在主 window.
为了使其成为 MyWidget
的子窗口小部件,您需要设置父窗口小部件并将其添加到布局中。
class myWidget(QWidget):
def __init__(self):
super().__init__()
self.myLay = QVBoxLayout()
self.setLayout(self.myLay)
# Notice self is being passed in to set the parent
self.mySlider = QSlider(Qt.Horizontal, self)
# You need to add widgets to a layout to position them properly
self.myLay.addWidget(self.mySlider)