Search code examples
buttoneventsitemsqlistwidget

Python listwidget click item button


First, you should know I'm very new to Python. I'm currently working on an app to increase my knowledge of this language.

I'm having a QListWidget which contains items based on a widget I created. This widget contains buttons like one to update or another to delete the item.

enter image description here

So I'm having troubles to do this action. For example, If I click on the update button, I want to open a window and load content by getting the item values.

enter image description here

How could I do that ?

This is my actual code

MainWindow

from PyQt5 import QtGui, QtWidgets, QtCore
from PyQt5.QtCore import QSize
from PyQt5.QtWidgets import QMainWindow, QHBoxLayout

from CustomWidgets.fb_line import fb_line
from Data.data_saver import data_saver
from MainWindows import Ui_MainWindow
from Windows.Ajout import Ajout
from Windows.Parametres import Parametres
from Windows.custom_fb_line import custom_fb_line


class MainWindow(QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.c_fb_l = custom_fb_line()
        self.parametres = Parametres()
        self.ajout = Ajout()
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.ui.btn_parametre.clicked.connect(self.button_open_parametres)
        self.ui.btn_ajouter.clicked.connect(self.button_open_ajout)
        self.ui.btn_annuler.clicked.connect(self.button_annuler)
        self.ui.btn_fermer.clicked.connect(self.close)
        self.addLines()

    def button_open_parametres(self):
        self.parametres.show()

    def button_open_ajout(self):
        self.ajout.show()

    def button_annuler(self):
        self.ui.lw_dossier.clear()
        self.addLines()

    def addLines(self):
        fbs = ds.read_data(data)
        listWidget = self.ui.lw_dossier
        listWidget.reset()

        for fb in fbs:
            item_widget = fb_line(fb)
            item = QtWidgets.QListWidgetItem(listWidget)
            item.setSizeHint(QSize(0, 50))
            listWidget.addItem(item)
            listWidget.setItemWidget(item, item_widget)

            listWidget.show()


data = "./Data/data.pkl"
ds = data_saver()

Widget :

from PyQt5 import QtWidgets
from Objects.enum import enum
from custom_fb_line import Ui_custom_fb_line


class fb_line(QtWidgets.QWidget):
    def __init__(self, fb, *args, **kwargs):
        QtWidgets.QWidget.__init__(self, *args, **kwargs)
        self.ui = Ui_custom_fb_line()
        self.ui.setupUi(self)
        self.ui.le_source.setText(fb.dossier_source)
        self.ui.le_cible.setText(fb.dossier_cible)
        self.ui.le_cron.setText("tous les " + str(fb.cron.number) + " " + enum().get_types()[fb.cron.type])
        self.ui.btn_delete.clicked.connect(self.delete)
        self.ui.btn_modifier.clicked.connect(self.modifier)
        self.ui.btn_demarrer.clicked.connect(self.demarrer)

    def delete(self):
        print('delete ')

    def modifier(self):
        print('modifier')

    def demarrer(self):
        print('démarrer')

So print does actually show in console but I can't figure out how to achieve button click to update or delete items.


Solution

  • Never mind, I found a way, which is really simple in fact. Being new to python, I didn't know how to pass arguments to methods plugged to buttons. Here is how to do that for anyone who could have same issues

    self.ui.btn_delete.clicked.connect(lambda: self.delete(fb))
    
        def delete(self, fb):
            print('delete ')
            print(fb.dossier_source)