Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. Language Bindings
  4. QPushButton binding does not work without lambda keyword
Forum Updated to NodeBB v4.3 + New Features

QPushButton binding does not work without lambda keyword

Scheduled Pinned Locked Moved Unsolved Language Bindings
5 Posts 3 Posters 999 Views 2 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • D Offline
    D Offline
    daweed
    wrote on last edited by aha_1980
    #1

    Hello,
    i am facing a problem that i don't understand why it happen.

    When binding a QPushButton in a subclass method of my project

    #! python3
    # -*- coding: utf-8 -*-
    
    import sys
    import re
    
    from PySide2.QtWidgets import *
    from PySide2.QtCore import Qt, QRect, QCoreApplication
    from PySide2.QtGui import QIcon, QFont, QPixmap
    
    from FGIntMngtUI.FGIntMngtDeviceTab import Ui_FGIntMngtDeviceTab
    from FGIntMngtUI.FGIntMngtMCP23017Tab import Ui_FGIntMngtMCP23017Tab
    
    class FGIntMngtDevice():
        def __init__(self, item: QTreeWidgetItem, objectTab: QTabWidget, displayLog: QTextEdit):
            self.item = item
            self.devicename = self.item.text(0)
            self.deviceid = self.item.text(1)
            self.deviceaddr = self.item.text(2)
            self.devicetype = self.item.text(3)
            self.objecttab = objectTab
            self.displaylog = displayLog
            self.devicetabValueSteelSheet = "QLabel { font-size:12pt; }"
    
        ##### ##### ##### ##### ##### ##### ##### #####
        # Self String
        ##### ##### ##### ##### ##### ##### ##### #####
        def __str__(self):
            return "Device Objects Managements (FGIntMngtDevice Class)"
        
        def updateDevice(self):
            self.displaylog.append("test")
            print("test")
    
        def getDevice(self):
            self.objecttab.clear()
            self.displaylog.append("Getting Device .... {}".format(type(self.objecttab)))
            self.displaylog.append("Device Name {}".format(self.devicename))
            self.displaylog.append("Device Type {}".format(self.devicetype))
            self.displaylog.append("Device Addr {}".format(self.deviceaddr))
            self.currenttab = Ui_FGIntMngtDeviceTab()
            self.currenttab.setupUi(self.objecttab)
            self.currenttab.DeviceApplyBtn.clicked.connect(self.updateDevice)
            #self.currenttab.DeviceApplyBtn.clicked.connect(lambda: self.updateDevice())
            self.currenttab.DeviceTypeValue.setStyleSheet(self.devicetabValueSteelSheet)
            self.currenttab.DeviceIdValue.setStyleSheet(self.devicetabValueSteelSheet)
            self.currenttab.DeviceIdValue.setText(self.deviceid)
            self.currenttab.DeviceAddrValue.setStyleSheet(self.devicetabValueSteelSheet)
            self.currenttab.DeviceAddrValue.setText(self.deviceaddr)
            self.currenttab.DeviceNameValue.setStyleSheet(self.devicetabValueSteelSheet)
            self.currenttab.DeviceNameValue.setText(self.devicename)
            index = self.currenttab.DeviceTypeValue.findText(self.devicetype, Qt.MatchFixedString)
            if index >= 0:
                self.currenttab.DeviceTypeValue.setCurrentIndex(index)
    

    the line binding the button [ this does not work ]

    self.currenttab.DeviceApplyBtn.clicked.connect(self.updateDevice)
    

    but if i use the following code it work

    self.currenttab.DeviceApplyBtn.clicked.connect(lambda: self.updateDevice())
    

    I don't understand why i am oblige to use lambda here.
    The main scripts create the GUI with a .py file create from a .ui file designed with Qt Designer.
    The main scripts call some other class and ui class

    If needed i can post more code

    Regards

    Daweed

    1 Reply Last reply
    0
    • SGaistS Offline
      SGaistS Offline
      SGaist
      Lifetime Qt Champion
      wrote on last edited by
      #2

      Hi and welcome to devnet,

      What version of PySide2 are you using ?
      How did you install it ?

      Interested in AI ? www.idiap.ch
      Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

      1 Reply Last reply
      0
      • D Offline
        D Offline
        daweed
        wrote on last edited by daweed
        #3

        Hello

        I am using pyside2 5.13.0
        and install it with the pip command

        pip3 install PySide2
        i am using python 3.7.2

        I am not sure that it's a pyside issue as if i am using for example the code to clear the displayLog widget [ QTextEdit object ] and no error are raised. The method updateDevice seems to just not be executed.

        self.currenttab.DeviceApplyBtn.clicked.connect(self.displayLog.clear)
        

        the binding work.

        I am asking myself if there is not a problem when "propagating" the variable [ QTabWidget ]. I'm probably doing something wrong but I can not understand what :)

        Here a view of the GUI

        GUI View

        The main windows is create in the main script

        #! python3
        # -*- coding: utf-8 -*-
        
        import sys
        import re
        import socket
        from PySide2.QtWidgets import *
        from PySide2.QtCore import Qt, QRect, QCoreApplication
        from PySide2.QtGui import QIcon, QFont, QPixmap
        
        # FarmerSoft Tools Lib
        from FGIntMngt.FGIntMngtConfig import FGIntMngtConfig
        from FGIntMngt.FGIntMngtClient import FGIntMngtClient
        from FGIntMngt.FGIntMngtObject import FGIntMngtObject
        
        # FGIntMngt UI Windows & Widgets
        from FGIntMngtUI.FGIntMngtMain import Ui_MainWindow
        from FGIntMngtUI.About import Ui_About
        
        class MainWindow(QMainWindow, Ui_MainWindow):
            ##### ##### ##### ##### ##### #####
            ##### MainWindow Constructor
            ##### ##### ##### ##### ##### #####
            def __init__(self):
                super(MainWindow, self).__init__()
        
                ##### ##### ##### ##### ##### ##### ##### #####
                ##### Main Windows Initialisation
                ##### ##### ##### ##### ##### ##### ##### #####
                self.setupUi(self)
        
                ##### ##### ##### ##### ##### ##### ##### #####
                ##### Properties
                ##### ##### ##### ##### ##### ##### ##### #####
                
                ##### ##### ##### ##### ##### ##### ##### #####
                ##### Steel Sheet
                ##### ##### ##### ##### ##### ##### ##### #####
                self.LabelSteelSheet = "QLabel { font: bold; }"
                self.conSteelSheet = "QLabel { font: bold; color: green; }"
                self.disconSteelSheet = "QLabel { font: bold; color: red; }"
        
                ##### FGIntMngt Configuration
                self.fgintmngtconfig = FGIntMngtConfig()
                self.fgintmngtconfig.readConfig('treeobjects.ini')
                self.treeBranches = self.fgintmngtconfig.loadBranch(self.objectsTree)
                self.logDisplay.clear()
                
                ##### FGIntMngt Object Tree
                self.fgintmngtobjects = FGIntMngtObject(self.objectsTree, self.objectTab, self.logDisplay)
        
                ##### FGIntMngt TCP CLient
                self.fgintmngtclient = FGIntMngtClient()
        
                ##### Tab Module
                
                ##### ##### ##### ##### ##### ##### ##### #####
                ##### Slots And Signals
                ##### ##### ##### ##### ##### ##### ##### #####
                
                ##### Main Window
                ##### ##### Menu File
                self.actionQuit.triggered.connect(self.quitGui)
        
                ##### ##### Menu Configuration
                self.actionReadDevices.triggered.connect(self.readDevices)
                
                ##### ##### Menu Help
                self.actionAbout.triggered.connect(self.showAbout)
        
                ##### Status Frame Binding
                self.connexionButton.clicked.connect(self.connectFGIntSrv)
                
                ##### Tree Frame Binding
                self.objectsTree.itemClicked.connect(self.fgintmngtobjects.getObject)
                
            def quitGui(self):
                self.fgintmngtclient.setConnStatus(0)
                self.close()
        
            def showAbout(self):
                ##### About UI
                self.about = QWidget()
                self.ui_about = Ui_About()
                self.ui_about.setupUi(self.about)
                self.about.show()
        
            def connectFGIntSrv(self):
                self.logDisplay.clear()
                self.logDisplay.append("Connexion Parameters : {}:{}".format(self.fgintmngtclient.getFGIntHost(), self.fgintmngtclient.getFGIntPort()))
                if self.fgintmngtclient.getConnStatus() == 0:
                    self.logDisplay.append("ready to connect")
                    if self.fgintmngtclient.connectServer() == 1:
                        self.logDisplay.append("Connection OK")
                        self.connstatusValue.setText('Connected')
                        self.connstatusValue.setStyleSheet(self.conSteelSheet)
                        self.connexionButton.setText('Disconnect')
                        data = self.fgintmngtclient.sock.recv(1024).decode("utf-8")
                        self.logDisplay.append(data)
                        self.readDevices()
                    else:
                        self.logDisplay.append("Connection Failed")
                        self.fgintmngtclient.setConnStatus(0)
                        self.connstatusValue.setText('Not Connected')
                        self.connexionButton.setText('Connect')
                        self.connstatusValue.setStyleSheet(self.disconSteelSheet)
                else:
                    self.logDisplay.append("Disconnection")
                    self.fgintmngtclient.setConnStatus(0)
                    self.connstatusValue.setText('Not Connected')
                    self.connexionButton.setText('Connect')
                    self.connstatusValue.setStyleSheet(self.disconSteelSheet)
                    self.fgintmngtclient.sendCmd("exit\n", 1024)
        
            def readDevices(self):
                self.logDisplay.clear()
                self.logDisplay.append("Nb d elements a purger : {}".format(self.treeBranches['Devices']['widget'].childCount()))
                if self.treeBranches['Devices']['widget'].childCount() > 0:
                    self.logDisplay.append("Cleaning Devices Branch ...")
                    for i in reversed(range(self.treeBranches['Devices']['widget'].childCount())):
                        self.treeBranches['Devices']['widget'].removeChild(self.treeBranches['Devices']['widget'].child(i))
                if self.fgintmngtclient.getConnStatus() == 1:
                    self.logDisplay.append("Listing devices from FG interface ...")
                    datatab = self.fgintmngtclient.sendCmd("show devices\n", 1024).splitlines()
                    #self.logDisplay.append("datatab Type : {}".format(type(datatab)))
                    #self.logDisplay.append("datatab Length: {}".format(len(datatab)))
                    devicenum = 1
                    devices = datatab[0][1:-1].split(',')
                    for device in devices:
                        for deviceaddr in device.split(' '):
                            if re.match("^\dx\d{2}$", deviceaddr[1:-1]):
                                self.logDisplay.append("New Device Found : {} at address {} Type : {}".format('device' + str(devicenum).zfill(2), deviceaddr[1:-1], 'Device'))
                                item = QTreeWidgetItem(self.treeBranches['Devices']['widget'], 0)
                                item.setText(0, 'device' + str(devicenum).zfill(2))
                                item.setText(1, 'item' + str(devicenum).zfill(2))
                                item.setText(2, deviceaddr[1:-1])
                                item.setText(3, 'Device')
                                item.setText(4, 'Unknow')
                                devicenum += 1
                else:
                    self.logDisplay.append("Not Connected")
        
        
        
        ##### ##### ##### ##### ##### ##### ##### #####
        ##### Main Application Definition & Execution
        ##### ##### ##### ##### ##### ##### ##### #####
        def main():
            app = QApplication(sys.argv)
            main_window = MainWindow()
            main_window.show()
            sys.exit(app.exec_())
        
        if __name__ == "__main__":
            main()
        

        When clicking on an item in the QTreeWidget, an object is creating with a FGIntMngtObject Class

        self.objectsTree.itemClicked.connect(self.fgintmngtobjects.getObject)
        

        The FGIntMngtObject Class

        #! python3
        # -*- coding: utf-8 -*-
        
        import sys
        
        from PySide2.QtWidgets import *
        from PySide2.QtCore import Qt, QRect, QCoreApplication
        from PySide2.QtGui import QIcon, QFont, QPixmap
        
        from FGIntMngt.FGIntMngtDevice import FGIntMngtDevice
        
        class FGIntMngtObject():
            def __init__(self, treeWidget: QTreeWidget, objectTab: QTabWidget, displayLog: QTextEdit):
                super(FGIntMngtObject, self).__init__()
                self.treeWidget = treeWidget
                self.objecttab = objectTab
                self.displaylog = displayLog
        
            ##### ##### ##### ##### ##### ##### ##### #####
            # Self String
            ##### ##### ##### ##### ##### ##### ##### #####
            def __str__(self):
                return "FGIntMngtObject Class"
        
            ##### ##### ##### ##### ##### ##### ##### #####
            # Class Methods
            ##### ##### ##### ##### ##### ##### ##### #####
            def getObject(self):
                # Debug Printing #
                #print("Getting Object from Tree ...")
                #print("Current Item : {}".format(self.treeWidget.currentItem()))
                #print("Item have {} Column(s) and {} Child(s)".format(self.treeWidget.currentItem().columnCount(), self.treeWidget.currentItem().childCount()))
                # End Debug Printing #
                if self.treeWidget.indexOfTopLevelItem(self.treeWidget.currentItem().parent()) != -1: # Check if obj is not a top level branch
                    #for c in range(self.treeWidget.currentItem().columnCount()):
                    #    print("Column {} Value {}".format(c, self.treeWidget.currentItem().text(c)))
                    if self.treeWidget.currentItem().text(3) == 'Device':
                    	#devicename, deviceaddr, devicetype, objectTab
                        element = FGIntMngtDevice(
                        	self.treeWidget.currentItem(),
                            self.objecttab,
                            self.displaylog
                            )
                        print("Nom de l'élément : {}".format(element.devicename))
                        element.getDevice()
        
            def updObject(self):
                print("Updating Object ....")
        

        And from that if the QTreeWiddgetItem is a 'Device' type a Device Object will be generated and the QTabWidget is populate via the FGIntMngtDevice Class

        Hopping that will help

        If needed , i can post UI python files

        Regards

        1 Reply Last reply
        0
        • SGaistS Offline
          SGaistS Offline
          SGaist
          Lifetime Qt Champion
          wrote on last edited by
          #4

          Can you rather post a minimal example that shows that behaviour ?

          Interested in AI ? www.idiap.ch
          Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

          1 Reply Last reply
          1
          • S Offline
            S Offline
            Sia1s
            wrote on last edited by Sia1s
            #5
            This post is deleted!
            1 Reply Last reply
            0

            • Login

            • Login or register to search.
            • First post
              Last post
            0
            • Categories
            • Recent
            • Tags
            • Popular
            • Users
            • Groups
            • Search
            • Get Qt Extensions
            • Unsolved