首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QListWidgetItem的内容调整

QListWidgetItem的内容调整
EN

Stack Overflow用户
提问于 2021-06-13 18:07:43
回答 1查看 210关注 0票数 0

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

当我按比例缩放宽度的时候,它看起来就像这里显示的一样.

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

代码语言:javascript
复制
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()
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-06-13 19:33:36

为列表项设置的大小提示是静态的,并且基于小部件的初始大小提示,因此它不会完全适应,特别是当内容可以更改其纵横比时。它会在需要的时候增加尺寸,但不会收缩。

问题来自单词包装,这是已知的Qt布局的限制。来自布局管理的布局问题部分:

在标签小部件中使用富文本可能会给其父小部件的布局带来一些问题。当标签被文字包装时,Qt的布局管理器处理富文本的方式会出现问题。

一个可能的解决方案是覆盖列表小部件的resizeEvent,并考虑到heightForWidth(),根据内容进行一些计算。

这需要两个for循环(只需一个循环就可以稍微优化,但改进最少,因为在当前的视图端口中不太可能看到这么多的小部件)。

第一个循环是检查可见项是否适合当前视图而不显示滚动条,第二个循环是根据可用宽度实际设置小部件的新大小提示。

显然,如果使用ScrollBarAlwaysOn策略,则只需要执行一个循环,考虑到滚动条的提示宽度(不要使用实际的滚动条大小,因为当视图尚未显示时,它将返回不同的值)。

代码语言:javascript
复制
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))
                )
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67961282

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档