QListWidget настроить размер для содержимого - PullRequest
32 голосов
/ 14 июня 2011

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

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

Проблема такая же, как здесь - 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_())

Ответы [ 6 ]

44 голосов
/ 16 июня 2011

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

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

list.setMinimumWidth(list.sizeHintForColumn(0))

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

class ListWidget(QListWidget):
  def sizeHint(self):
    s = QSize()
    s.setHeight(super(ListWidget,self).sizeHint().height())
    s.setWidth(self.sizeHintForColumn(0))
    return s
8 голосов
/ 08 января 2015

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

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

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

Согласно комментарию *1013* от 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_()
2 голосов
/ 16 июня 2011

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

0 голосов
/ 13 июля 2011
QListWidget *valList;

valList =  new QListWidget(this);

valList->setSizePolicy (QSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored));
valList->setMinimumSize (QSize(1111, 111));
0 голосов
/ 16 июня 2011

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

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

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

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

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

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

0 голосов
/ 14 июня 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...