当用户调整对话框的大小时,如何将列表项的比例调整到他们的。目前他们似乎没有这样做..。它们的大小与启动工具的大小相同。我已经启用了单词包装。我该怎么解决这个问题?
当我按比例缩放宽度的时候,它看起来就像这里显示的一样.

但是当我把它放大的时候看上去不对

import os
import sys
import re
import random
from PySide2 import QtGui, QtWidgets, QtCore
class ListWidgetItem(QtWidgets.QWidget):
def __init__(self, parent=None):
super(ListWidgetItem, self).__init__(parent)
self.setStyleSheet('background: green;')
self.uiTitle = QtWidgets.QLabel()
self.uiTitle.setWordWrap(True)
self.uiTitle.setText('Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc porta ornare odio sit amet suscipit. Curabitur orci urna, commodo quis urna ut, consequat sodales urna.')
self.subtitle = QtWidgets.QLabel()
self.subtitle.setText('Title')
undoicon = self.style().standardIcon(QtWidgets.QStyle.SP_BrowserReload)
self.button = QtWidgets.QPushButton('Click Me')
self.button.setIcon(undoicon)
self.mainLayout = QtWidgets.QVBoxLayout()
self.mainLayout.setAlignment(QtCore.Qt.AlignTop)
self.mainLayout.setSpacing(0)
self.mainLayout.addWidget(self.subtitle)
self.mainLayout.addWidget(self.uiTitle)
self.mainLayout.addWidget(self.button)
self.setLayout(self.mainLayout)
class ListWidget(QtWidgets.QListWidget):
def __init__(self, parent=None):
super(ListWidget, self).__init__(parent)
self.resize(400,400)
self.setSpacing(1)
self.setSelectionMode(QtWidgets.QListView.ExtendedSelection)
self.setVerticalScrollMode(QtWidgets.QAbstractItemView.ScrollPerPixel)
self.verticalScrollBar().setSingleStep(10)
self.setWordWrap(True)
self.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
self.setSizeAdjustPolicy(QtWidgets.QListWidget.AdjustToContents)
self.populateItems()
def appendListWidget(self, widget):
lwi = QtWidgets.QListWidgetItem()
lwi.setSizeHint(widget.sizeHint())
self.addItem(lwi)
self.setItemWidget(lwi, widget)
def populateItems(self):
for x in range(10):
widget = ListWidgetItem()
self.appendListWidget(widget)
def main():
app = QtWidgets.QApplication(sys.argv)
ex = ListWidget()
ex.show()
app.exec_()
if __name__ == '__main__':
pass
main()发布于 2021-06-13 19:33:36
为列表项设置的大小提示是静态的,并且基于小部件的初始大小提示,因此它不会完全适应,特别是当内容可以更改其纵横比时。它会在需要的时候增加尺寸,但不会收缩。
问题来自单词包装,这是已知的Qt布局的限制。来自布局管理的布局问题部分:
在标签小部件中使用富文本可能会给其父小部件的布局带来一些问题。当标签被文字包装时,Qt的布局管理器处理富文本的方式会出现问题。
一个可能的解决方案是覆盖列表小部件的resizeEvent,并考虑到heightForWidth(),根据内容进行一些计算。
这需要两个for循环(只需一个循环就可以稍微优化,但改进最少,因为在当前的视图端口中不太可能看到这么多的小部件)。
第一个循环是检查可见项是否适合当前视图而不显示滚动条,第二个循环是根据可用宽度实际设置小部件的新大小提示。
显然,如果使用ScrollBarAlwaysOn策略,则只需要执行一个循环,考虑到滚动条的提示宽度(不要使用实际的滚动条大小,因为当视图尚未显示时,它将返回不同的值)。
class ListWidget(QtWidgets.QListWidget):
# ...
def resizeEvent(self, event):
super().resizeEvent(event)
width = self.viewport().width() - self.frameWidth() * 2
if width > self.minimumSizeHint().width():
# ensure that we have enough horizontal space to display the
# contents by avoiding recursion of the resize event
maxHeight = self.viewport().height()
height = 0
spacing = self.spacing()
for i in range(self.count()):
item = self.item(i)
widget = self.itemWidget(item)
if not widget:
continue
height += widget.heightForWidth(width)
if height > maxHeight:
# we can't fit all items in the current visible rect
width -= self.verticalScrollBar().sizeHint().width()
break
height += spacing
else:
width = self.minimumSizeHint().width()
for i in range(self.count()):
item = self.item(i)
widget = self.itemWidget(item)
if widget:
item.setSizeHint(
QtCore.QSize(width, widget.heightForWidth(width))
)https://stackoverflow.com/questions/67961282
复制相似问题