Skip to content

ListWidget

Qt Base Class: QListWidget

Signature: QListWidget(self, parent: Optional[PySide6.QtWidgets.QWidget] = None) -> None

Base classes

Name Children Inherits
ListViewMixin
prettyqt.widgets.listview
QListWidget
PySide6.QtWidgets
QListWidget(self, parent: Optional[PySide6.QtWidgets.QWidget] \= None) -> None

⋔ Inheritance diagram

graph TD
  1473296332992["widgets.ListWidget"]
  1473296328112["widgets.ListViewMixin"]
  1473293692144["widgets.AbstractItemViewMixin"]
  1473293679456["widgets.AbstractScrollAreaMixin"]
  1473293662864["widgets.FrameMixin"]
  1473293688240["widgets.WidgetMixin"]
  1473299815024["core.ObjectMixin"]
  140713234304496["builtins.object"]
  1473245548480["gui.PaintDeviceMixin"]
  1473241454992["QtWidgets.QListWidget"]
  1473241461824["QtWidgets.QListView"]
  1473241438400["QtWidgets.QAbstractItemView"]
  1473290616416["QtWidgets.QAbstractScrollArea"]
  1473290626176["QtWidgets.QFrame"]
  1473290849680["QtWidgets.QWidget"]
  1473288842240["QtCore.QObject"]
  1473291690208["Shiboken.Object"]
  1473300082368["QtGui.QPaintDevice"]
  1473296328112 --> 1473296332992
  1473293692144 --> 1473296328112
  1473293679456 --> 1473293692144
  1473293662864 --> 1473293679456
  1473293688240 --> 1473293662864
  1473299815024 --> 1473293688240
  140713234304496 --> 1473299815024
  1473245548480 --> 1473293688240
  140713234304496 --> 1473245548480
  1473241454992 --> 1473296332992
  1473241461824 --> 1473241454992
  1473241438400 --> 1473241461824
  1473290616416 --> 1473241438400
  1473290626176 --> 1473290616416
  1473290849680 --> 1473290626176
  1473288842240 --> 1473290849680
  1473291690208 --> 1473288842240
  140713234304496 --> 1473291690208
  1473300082368 --> 1473290849680
  1473291690208 --> 1473300082368

🛈 DocStrings

Bases: ListViewMixin, QListWidget

Item-based list widget.

Source code in prettyqt\widgets\listwidget.py
class ListWidget(widgets.ListViewMixin, widgets.QListWidget):
    """Item-based list widget."""

    value_changed = core.Signal(object)

    def __init__(self, *args, selection_mode: str = "single", **kwargs):
        super().__init__(*args, selection_mode=selection_mode, **kwargs)
        self.itemSelectionChanged.connect(self.on_index_change)

    def __repr__(self):
        return f"{type(self).__name__}: {self.count()} items"

    def __getitem__(
        self, row: int | slice
    ) -> widgets.QListWidgetItem | listdelegators.ListDelegator[widgets.QListWidgetItem]:
        match row:
            case int():
                item = self.item(row)
                if item is None:
                    raise KeyError(row)
                return item
            case slice():
                count = self.itemCount() if row.stop is None else row.stop
                values = list(range(count)[row])
                ls = [self.item(i) for i in values]
                return listdelegators.ListDelegator(ls)
            case _:
                raise TypeError(row)

    def __delitem__(self, row: int):
        self.takeItem(row)

    def __add__(self, other: widgets.QListWidgetItem):
        self.addItem(other)
        return self

    def __iter__(self) -> Iterator[widgets.QListWidgetItem]:
        return iter(self.get_children())

    def __len__(self) -> int:
        return self.count()

    def sort(self, reverse: bool = False):
        order = constants.DESCENDING if reverse else constants.ASCENDING
        self.sortItems(order)

    def on_index_change(self):
        data = self.get_value()
        self.value_changed.emit(data)

    def get_children(self) -> listdelegators.ListDelegator[widgets.QListWidgetItem]:
        items = [self.item(row) for row in range(self.count())]
        return listdelegators.ListDelegator(items)

    def add_items(self, items: Iterable | Mapping):
        match items:
            case Mapping():
                for k, v in items.items():
                    self.add(v, k)
            case Iterable():
                for i in items:
                    if isinstance(i, tuple | list):
                        self.add(*i)
                    else:
                        self.add(i)
            case _:
                raise TypeError(items)

    @functools.singledispatchmethod
    def add_item(
        self,
        name: str = "",
        icon: datatypes.IconType = None,
        data: dict | None = None,
        foreground: QtGui.QBrush | None = None,
        background: QtGui.QBrush | None = None,
        font: QtGui.QFont | None = None,
        selected: bool = None,
        status_tip: str = "",
        tool_tip: str = "",
        whats_this: str | None = None,
        # text_alignment: Optional[str] = None,
        checkstate: constants.StateStr | constants.CheckState | None = None,
        flags: constants.ItemFlag | None = None,
        size_hint: datatypes.SizeType | None = None,
        is_user_type: bool = False,
    ) -> widgets.ListWidgetItem:
        typ = 1 if is_user_type else 0
        item = widgets.ListWidgetItem(name, self, typ)
        if icon is not None:
            icon = iconprovider.get_icon(icon)
            item.setIcon(icon)
        if data is not None:
            for k, v in data.items():
                item.set_data(k, v)
        if foreground is not None:
            item.setForeground(foreground)
        if background is not None:
            item.setBackground(background)
        if font is not None:
            item.setFont(font)
        if flags is not None:
            item.setFlags(flags)
        if selected:
            item.setSelected(selected)
        if status_tip:
            item.setStatusTip(status_tip)
        if tool_tip:
            item.setToolTip(tool_tip)
        if whats_this:
            item.setWhatsThis(whats_this)
        if size_hint is not None:
            item.set_size_hint(size_hint)
        if checkstate is not None:
            item.set_checkstate(checkstate)
        self.addItem(item)
        return item

    @add_item.register
    def _(self, listitem: widgets.QListWidgetItem):
        self.addItem(listitem)

    def add(self, label: str, data=NoData, icon: datatypes.IconType = None):
        if data is NoData:
            data = label
        item = widgets.ListWidgetItem(label)
        item.set_icon(icon)
        item.setData(constants.USER_ROLE, data)  # type: ignore
        self.addItem(item)

    def get_value(self) -> list[Any]:
        return [i.data(constants.USER_ROLE) for i in self.selectedItems()]  # type: ignore

    def set_value(self, value):
        for i in self.get_children():
            if i.data(constants.USER_ROLE) in value:  # type: ignore
                self.setCurrentItem(i)
                break

    def scroll_to_item(
        self,
        item: widgets.QListWidgetItem,
        mode: widgets.abstractitemview.ScrollHintStr
        | widgets.QAbstractItemView.ScrollHint = "ensure_visible",
    ):
        self.scrollToItem(item, widgets.abstractitemview.SCROLL_HINT.get_enum_value(mode))

    def find_items(
        self,
        text: str,
        column: int = 0,
        mode: constants.MatchFlagStr | constants.MatchFlag = "exact",
        recursive: bool = False,
        case_sensitive: bool = False,
    ) -> listdelegators.ListDelegator[widgets.QListWidgetItem]:
        flag = constants.MATCH_FLAGS.get_enum_value(mode)
        if recursive:
            flag |= constants.MatchFlag.MatchRecursive
        if case_sensitive:
            flag |= constants.MatchFlag.MatchCaseSensitive
        items = self.findItems(text, flag, column)  # type: ignore
        return listdelegators.ListDelegator(items)

⌗ Property table

Qt Property Type Doc
objectName QString
modal bool
windowModality Qt::WindowModality
enabled bool
geometry QRect
frameGeometry QRect
normalGeometry QRect
x int
y int
pos QPoint
frameSize QSize
size QSize
width int
height int
rect QRect
childrenRect QRect
childrenRegion QRegion
sizePolicy QSizePolicy
minimumSize QSize
maximumSize QSize
minimumWidth int
minimumHeight int
maximumWidth int
maximumHeight int
sizeIncrement QSize
baseSize QSize
palette QPalette
font QFont
cursor QCursor
mouseTracking bool
tabletTracking bool
isActiveWindow bool
focusPolicy Qt::FocusPolicy
focus bool
contextMenuPolicy Qt::ContextMenuPolicy
updatesEnabled bool
visible bool
minimized bool
maximized bool
fullScreen bool
sizeHint QSize
minimumSizeHint QSize
acceptDrops bool
windowTitle QString
windowIcon QIcon
windowIconText QString
windowOpacity double
windowModified bool
toolTip QString
toolTipDuration int
statusTip QString
whatsThis QString
accessibleName QString
accessibleDescription QString
layoutDirection Qt::LayoutDirection
autoFillBackground bool
styleSheet QString
locale QLocale
windowFilePath QString
inputMethodHints QFlags
frameShape QFrame::Shape
frameShadow QFrame::Shadow
lineWidth int
midLineWidth int
frameWidth int
frameRect QRect
verticalScrollBarPolicy Qt::ScrollBarPolicy
horizontalScrollBarPolicy Qt::ScrollBarPolicy
sizeAdjustPolicy QAbstractScrollArea::SizeAdjustPolicy
autoScroll bool
autoScrollMargin int
editTriggers QFlags
tabKeyNavigation bool
showDropIndicator bool
dragEnabled bool
dragDropOverwriteMode bool
dragDropMode QAbstractItemView::DragDropMode
defaultDropAction Qt::DropAction
alternatingRowColors bool
selectionMode QAbstractItemView::SelectionMode
selectionBehavior QAbstractItemView::SelectionBehavior
iconSize QSize
textElideMode Qt::TextElideMode
verticalScrollMode QAbstractItemView::ScrollMode
horizontalScrollMode QAbstractItemView::ScrollMode
movement QListView::Movement
flow QListView::Flow
isWrapping bool
resizeMode QListView::ResizeMode
layoutMode QListView::LayoutMode
spacing int
gridSize QSize
viewMode QListView::ViewMode
modelColumn int
uniformItemSizes bool
batchSize int
wordWrap bool
selectionRectVisible bool
itemAlignment QFlags
count int
currentRow int
sortingEnabled bool