Pyqt 5 изменение текущий элемент в QListWidget

Мне при каждом изменении выбранного в QListWidget нужно менять другие виджеты, как это сделать?


Ответы (2 шт):

Автор решения: LIshy2

Нужно использовать currentRowChanged

→ Ссылка
Автор решения: S. Nick

Пример практического применения сигнала currentRowChanged , для понимания сути заданного вопроса:

import sys
from random import randint
from PyQt5.QtCore import Qt, QSize
from PyQt5.QtGui  import QIcon
from PyQt5.QtWidgets import (QApplication, QWidget, QListWidget, QStackedWidget, 
                             QHBoxLayout, QListWidgetItem, QLabel)


class LeftTabWidget(QWidget):
    def __init__(self, *args, **kwargs):
        super(LeftTabWidget, self).__init__(*args, **kwargs)
        self.resize(800, 600)
        # Левый и правый макет (один QListWidget слева + QStackedWidget справа)
        layout = QHBoxLayout(self, spacing=0)
        layout.setContentsMargins(0, 0, 0, 0)
        # QListWidget слева
        self.listWidget = QListWidget(self)
        layout.addWidget(self.listWidget)
        # QStackedWidget  справа
        self.stackedWidget = QStackedWidget(self)
        layout.addWidget(self.stackedWidget)

        self.initUi()

    def initUi(self):
        # Интерфейс инициализации
        # Переключить порядковый номер в QStackedWidget на текущее изменение элемента QListWidget
        self.listWidget.currentRowChanged.connect(
            self.stackedWidget.setCurrentIndex)

        # Удалить border
        self.listWidget.setFrameShape(QListWidget.NoFrame)
        # Скрыть полосу прокрутки
        self.listWidget.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
        self.listWidget.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)

        # Здесь мы используем общий текст с режимом значков 
        # (вы также можете использовать режим значков, setViewMode напрямую)
        for i in range(5):
            item = QListWidgetItem(
                QIcon('Ok.png'), str('Option %s' % i), self.listWidget)
            # Установите ширину и высоту элемента по умолчанию (здесь полезна только высота)
            item.setSizeHint(QSize(16777215, 60))
            # Текст по центру
            item.setTextAlignment(Qt.AlignCenter)

        # Имитация 5 правых страниц 
        for i in range(5):
            label = QLabel('Это страница %d' % i, self)
            label.setAlignment(Qt.AlignCenter)
            # Установить цвет фона метки (случайно)
            # добавлено поле margin (чтобы легко различать цвета QStackedWidget и QLabel)
            label.setStyleSheet('background: rgb(%d, %d, %d); margin: 50px;' % (
                randint(0, 255), randint(0, 255), randint(0, 255)))
            self.stackedWidget.addWidget(label)


# style sheet
Stylesheet = """
QListWidget, QListView, QTreeWidget, QTreeView {
    outline: 0px;
}
QListWidget {
    min-width: 120px;
    max-width: 120px;
    color: white;
    background: black;
}
QListWidget::item:selected {
    background: rgb(52, 52, 52);
    border-left: 2px solid rgb(9, 187, 7);
}
HistoryPanel::item:hover {background: rgb(52, 52, 52);}
QStackedWidget {background: rgb(30, 30, 30);}
QLabel {color: white;}
"""

if __name__ == '__main__':
    app = QApplication(sys.argv)
    app.setStyleSheet(Stylesheet)
    w = LeftTabWidget()
    w.show()
    sys.exit(app.exec_())

введите сюда описание изображения

→ Ссылка