我正在使用PyQt5,并且希望将一些控件堆叠在一起。我希望这些控件能够根据其内容确定其自身的大小。例如,如果我有三个按钮,其内容分别为“一个”,“两个两个”和“三个三个三”,则第一个按钮应最小,而在左上角,第二个按钮应紧接在第一个和稍宽等等。应当指出的是,这些将放置在QScrollArea
中,您可以期待成百上千的堆叠物品。
我尝试过QVBoxLayout
,但是如果没有足够的空间来填充父按钮,则所有按钮的大小都相同,并在屏幕上延伸,并漂浮在中间。
答案 0 :(得分:1)
尝试一下:
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
class MyWin(QtWidgets.QWidget):
def __init__(self, nameButton, parent=None):
super().__init__()
self.lay = QtWidgets.QGridLayout(self)
self.lay.setContentsMargins(10, 10, 10, 10)
for ind, itm in enumerate(nameButton):
text = "{} {}".format(itm, itm*ind)
self.button = QtWidgets.QPushButton(text)
self.button.setFixedWidth(
QtGui.QFontMetrics(self.button.font()).width(self.button.text()+"___"))
self.button.clicked.connect(self.onButton)
self.lay.addWidget(self.button, ind, 0, QtCore.Qt.AlignLeft | QtCore.Qt.AlignTop)
self.lay.setRowStretch(ind+1, 1)
def onButton(self):
print(self.sender().text())
nameButton = [' one', ' two ', ' three ']
if __name__=="__main__":
app = QtWidgets.QApplication(sys.argv)
myapp = MyWin(nameButton)
myapp.show()
sys.exit(app.exec_())
答案 1 :(得分:1)
您可以在QVboxLayout
中设置小部件的对齐方式,以停止拉伸以适应宽度。而且,您还可以在布局的末尾添加一个可拉伸的间隔物,以阻止小部件在垂直方向上自行隔开。
当放置在滚动区域内时,它将如下所示:
这是一个简单的演示:
import sys
from PyQt5 import QtCore, QtWidgets
class Window(QtWidgets.QWidget):
def __init__(self):
super(Window, self).__init__()
scroll = QtWidgets.QScrollArea()
widget = QtWidgets.QWidget(scroll)
vbox = QtWidgets.QVBoxLayout(widget)
for index in range(5):
for text in 'One', 'Two Two', 'Three Three Three':
button = QtWidgets.QToolButton()
button.setText('%s %s' % (text, index))
vbox.addWidget(button, 0, QtCore.Qt.AlignLeft)
vbox.addStretch()
scroll.setWidget(widget)
layout = QtWidgets.QVBoxLayout(self)
layout.addWidget(scroll)
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
window = Window()
window.setGeometry(600, 100, 300, 300)
window.show()
sys.exit(app.exec_())