PyQt5 как считывать list widget?

Я хочу написать что-то на подобии музыкального плеера, где при выборе mp3 в списке она будет проигрываться. Но, пока, я даже не дошёл до того чтобы при выборе элемента в консоль писалось click.

Помогите сделать обработку нажатий в листе. Визуал делал с помощью Qt Disigner.

from PyQt5 import QtGui, QtCore, QtWidgets
from PyQt5.QtWidgets import *

import sys


def clicked():     #Функция которая должна вызываться при выборе элемента из списка(можно не обращать внимание.)
    print("click")


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(640, 402)
        MainWindow.setStyleSheet("background-color: qlineargradient(spread:pad, x1:0.182, y1:0.102409, x2:1, y2:1, stop:0.113636 rgba(0, 62, 79, 147), stop:0.306818 rgba(28, 14, 68, 156));")
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(-130, -40, 1031, 491))
        self.label.setText("")
        self.label.setPixmap(QtGui.QPixmap("2HYI.gif"))
        self.label.setObjectName("label")
        self.widget = QtWidgets.QWidget(self.centralwidget)
        self.widget.setGeometry(QtCore.QRect(0, 310, 641, 80))
        self.widget.setObjectName("widget")
        self.listWidget = QtWidgets.QListWidget(self.centralwidget) #Начиная отсюда list
        self.listWidget.setGeometry(QtCore.QRect(0, 0, 121, 311))
        self.listWidget.setStyleSheet("font: 75 italic 8pt \"MS Sans Serif\";\n"
"color: rgb(121, 92, 121);")
        self.listWidget.setObjectName("listWidget")
        item = QtWidgets.QListWidgetItem()
        font = QtGui.QFont()
        font.setFamily("Roman")
        font.setBold(True)
        font.setItalic(True)
        font.setWeight(75)
        item.setFont(font)
        self.listWidget.addItem(item)
        item = QtWidgets.QListWidgetItem()
        self.listWidget.addItem(item)
        item = QtWidgets.QListWidgetItem()
        self.listWidget.addItem(item)
        item = QtWidgets.QListWidgetItem()
        self.listWidget.addItem(item) 
        #сюда я пытался привязать clicked и connect
        MainWindow.setCentralWidget(self.centralwidget) 
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)
        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow): 
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        __sortingEnabled = self.listWidget.isSortingEnabled()
        self.listWidget.setSortingEnabled(False)
        item=self.listWidget.item(0)
        item.setText(_translate("MainWindow", "New Item"))
        item = self.listWidget.item(1)
        item.setText(_translate("MainWindow", "New Item"))
        item = self.listWidget.item(2)
        item.setText(_translate("MainWindow", "New Item"))
        item = self.listWidget.item(3)
        item.setText(_translate("MainWindow", 'w'))
        self.listWidget.setSortingEnabled(__sortingEnabled)

#сюда тоже

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

В Qt Designer использовал listwidget нашёл ещё что-то про listview.


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

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

В общем мне нужно сделать обработку нажатий в листе

Вы можете воспользоваться функцией itemClicked.

Например, обработку нажатия на элемент из listWidget можно привязать к функции clicked, только саму функцию добавьте в класс Ui_MainWindow:

def setupUi(self, MainWindow):
    . . . 
    self.listWidget.itemClicked.connect(self.clicked)

def clicked(self, item):
    print(f'clicked {item}') 
→ Ссылка
Автор решения: S. Nick

Не изменяйте код, сгенерированный Qt Designer. Создайте другой класс, который наследуется от соответствующего виджета, и используйте созданный класс для его заполнения.

void QListWidget::itemClicked(QListWidgetItem *item)

Этот сигнал излучается с указанным элементом при нажатии кнопки мыши на элементе в виджете.

main.py

import sys
from PyQt5 import QtGui, QtCore, QtWidgets
from PyQt5.QtWidgets import *


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(640, 402)
        MainWindow.setStyleSheet("background-color: qlineargradient(spread:pad, x1:0.182, y1:0.102409, x2:1, y2:1, stop:0.113636 rgba(0, 62, 79, 147), stop:0.306818 rgba(28, 14, 68, 156));")
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(-130, -40, 1031, 491))
        self.label.setText("")
        self.label.setPixmap(QtGui.QPixmap("2HYI.gif"))
        self.label.setObjectName("label")
        self.widget = QtWidgets.QWidget(self.centralwidget)
        self.widget.setGeometry(QtCore.QRect(0, 310, 641, 80))
        self.widget.setObjectName("widget")
        self.listWidget = QtWidgets.QListWidget(self.centralwidget) #Начиная отсюда list
        self.listWidget.setGeometry(QtCore.QRect(0, 0, 121, 311))
        self.listWidget.setStyleSheet("font: 75 italic 8pt \"MS Sans Serif\";\n"
"color: rgb(121, 92, 121);")
        self.listWidget.setObjectName("listWidget")
        item = QtWidgets.QListWidgetItem()
        font = QtGui.QFont()
        font.setFamily("Roman")
        font.setBold(True)
        font.setItalic(True)
        font.setWeight(75)
        item.setFont(font)
        self.listWidget.addItem(item)
        item = QtWidgets.QListWidgetItem()
        self.listWidget.addItem(item)
        item = QtWidgets.QListWidgetItem()
        self.listWidget.addItem(item)
        item = QtWidgets.QListWidgetItem()
        self.listWidget.addItem(item)
     
        MainWindow.setCentralWidget(self.centralwidget) 
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)
        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow): 
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        __sortingEnabled = self.listWidget.isSortingEnabled()
        self.listWidget.setSortingEnabled(False)
        item=self.listWidget.item(0)
        item.setText(_translate("MainWindow", "New Item"))
        item = self.listWidget.item(1)
        item.setText(_translate("MainWindow", "New Item"))
        item = self.listWidget.item(2)
        item.setText(_translate("MainWindow", "New Item"))
        item = self.listWidget.item(3)
        item.setText(_translate("MainWindow", 'w'))
        self.listWidget.setSortingEnabled(__sortingEnabled)


class MainWindow(QMainWindow, Ui_MainWindow):                     
    def __init__(self):
        super().__init__()
        
        self.setupUi(self)
        
        self.myList = ['Item 1', 'Item 2', 'Item 3', 'Item 4', ]
        self.listWidget.addItems(self.myList)
        
        self.listWidget.itemClicked.connect(self.onClicked)
        
    def onClicked(self, item): 
        print(f'\nitem: {item}') #
        print(f'item.text: {item.text()}') #
      

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())

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

→ Ссылка