Подтвердить что ты не робот

QListWidget регулирует размер контента

Можно ли настроить высоту и ширину QListWidget для этого контента?

sizeHint() всегда возвращает 256, 192 независимо от его содержимого.
QListWidgetItem sizeHint() возвращает -1, -1, поэтому я не могу получить ширину содержимого.

Задайте то же самое, что и здесь - http://www.qtcentre.org/threads/31787-QListWidget-width, но решения нет.

enter image description here

import sys
from PyQt4.QtGui import *

class MainWindow(QWidget):
    def __init__(self, parent=None):
        QWidget.__init__(self, parent)

        list = QListWidget()
        list.addItem('111111111111111')

        vbox = QVBoxLayout(self)
        vbox.addWidget(list)

app = QApplication(sys.argv)
myapp = MainWindow()
myapp.show()
sys.exit(app.exec_())
4b9b3361

Ответ 1

sizeHint() всегда возвращает 256, 192 нет важно, каково его содержание.

Это потому, что это размер QListWidget, видового экрана, а не элементов. sizeHintForColumn() даст вам максимальный размер по всем элементам, поэтому вы можете изменить размер виджета следующим образом:

list.setMinimumWidth(list.sizeHintForColumn(0))

Если вы не хотите принуждать минимальную ширину, тогда подкласс и укажите это как подсказку размера. Например:.

class ListWidget(QListWidget):
  def sizeHint(self):
    s = QSize()
    s.setHeight(super(ListWidget,self).sizeHint().height())
    s.setWidth(self.sizeHintForColumn(0))
    return s

Ответ 2

Используя takois answer Я играл с sizeHintForColumn или sizeHintForRow и обнаружил, что вам нужно добавить несколько большие числа, потому что может быть какая-то зависящая от стиля поля все еще. ekhumoros comment, затем поместите меня на правильный путь.

Короче говоря, полный размер виджета списка:

list.sizeHintForColumn(0) + 2 * list.frameWidth()
list.sizeHintForRow(0) * list.count() + 2 * list.frameWidth())

В соответствии с comment от Violet он не может работать в Qt 5.

Также имейте в виду, что при настройке размера содержимого вам не нужны полосы прокрутки, поэтому я отключу их.

Мой полный пример для QListWidget, связанного с его размером содержимого:

from PySide import QtGui, QtCore

app = QtGui.QApplication([])

window = QtGui.QWidget()
layout = QtGui.QVBoxLayout(window)
list = QtGui.QListWidget()
list.addItems(['Winnie Puh', 'Monday', 'Tuesday', 'Minnesota', 'Dracula Calista Flockhart Meningitis', 'Once', '123345', 'Fin'])
list.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
list.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
list.setFixedSize(list.sizeHintForColumn(0) + 2 * list.frameWidth(), list.sizeHintForRow(0) * list.count() + 2 * list.frameWidth())
layout.addWidget(list)

window.show()

app.exec_()

Ответ 3

Чтобы эффективно использовать sizeHint, вы должны переопределить его, по крайней мере, на С++. По моему опыту, реализация по умолчанию для виджетов может быть довольно бесполезной, если вам нужно определенное поведение. Попытки заставить то, что вы хотите с помощью прокладок или макетов, заканчиваются катастрофой. Если вы можете получить из QListWidget и переопределить sizeHint, вы можете выполнять итерацию по вашим элементам и находить самую длинную строку, а затем делать какую-то магию, чтобы определить, насколько она должна быть.

Что бы я сделал, во всяком случае.

Ответ 4

Сначала вы должны получить свою самую большую строку в списке, которую легко получить.

После получения этой строки выполните следующие действия:

QFontMetrics * fm = new QFontMetrics(widget->font());
QRect rect;
rect = fm->boundingRect(string);

rect.width() имеет ширину в пикселях самой большой строки rect.height() имеет высоту.

Установите ширину QListWidget равной ширине прямоугольника (плюс поля) и высоту до этой высоты прямоугольника, умноженное на количество элементов

Я не тестировал код, но надеюсь, что он поместит вас на правильный трек

Ответ 5

QListWidget *valList;

valList =  new QListWidget(this);

valList->setSizePolicy (QSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored));
valList->setMinimumSize (QSize(1111, 111));

Ответ 6

Вам нужно получить QHeaderView вашего QListWidget и настроить его режим изменения размера.

Прочтите эту документацию для получения дополнительной информации

http://doc.qt.nokia.com/latest/qheaderview.html#ResizeMode-enum