Error while implementing signal/slots in PySide2 using Qt Designer

2

I have designed a user interface using Qt Designer and added signal/slots using signal/slot editor. I have pushButton in my UI, signal is clicked() and slot is click(). The pushButton is a widget that I created with QT Designer. Using python 3.7 and QT designer 5.12

QT Designer auto generated below code:

from PySide2 import QtCore, QtGui, QtWidgets

class Ui_mainWindow(object):
    def setupUi(self, mainWindow):
       mainWindow.setObjectName("mainWindow")
       self.pushButton = QtWidgets.QPushButton(self.frame_1)
       self.pushButton.setObjectName("pushButton")
       QtCore.QObject.connect(self.pushButton, QtCore.SIGNAL("clicked()"), self.pushButton.click)
       QtCore.QMetaObject.connectSlotsByName(mainWindow)

I added below code inside class UI_mainWindow() for performing pushbutton.click functionality. But am getting error. Please help me solve this issue. I need button click functionality to be added in my code

class pushButton():
        def click(self):
            print("Button is clicked")  

.ui file generated by QT Designer:

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>800</width>
    <height>600</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <widget class="QWidget" name="centralwidget">
   <widget class="QPushButton" name="pushButton">
    <property name="geometry">
     <rect>
      <x>20</x>
      <y>20</y>
      <width>56</width>
      <height>17</height>
     </rect>
    </property>
    <property name="text">
     <string>PushButton</string>
    </property>
   </widget>
  </widget>
  <widget class="QMenuBar" name="menubar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>800</width>
     <height>18</height>
    </rect>
   </property>
  </widget>
  <widget class="QStatusBar" name="statusbar"/>
 </widget>
 <resources/>
 <connections>
  <connection>
   <sender>pushButton</sender>
   <signal>clicked()</signal>
   <receiver>pushButton</receiver>
   <slot>click()</slot>
   <hints>
    <hint type="sourcelabel">
     <x>107</x>
     <y>76</y>
    </hint>
    <hint type="destinationlabel">
     <x>107</x>
     <y>76</y>
    </hint>
   </hints>
  </connection>
 </connections>
</ui>

Error:

Process finished with exit code -1073741571 (0xC00000FD)

python
qt-designer
pyside2
asked on Stack Overflow Aug 11, 2019 by Arvinth • edited Aug 11, 2019 by eyllanesc

1 Answer

1

With your initial logic you are creating an infinite loop since if you emit the clicked signal for example by pressing the button according to your logic the click() method of the same button will also be called that also emits the clicked signal that will call back the click() method of the same button, etc, that will never end.

Instead, connect the clicked signal to the window:

enter image description here

Getting the following .ui:

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>800</width>
    <height>600</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <widget class="QWidget" name="centralwidget">
   <widget class="QPushButton" name="pushButton">
    <property name="geometry">
     <rect>
      <x>20</x>
      <y>20</y>
      <width>56</width>
      <height>17</height>
     </rect>
    </property>
    <property name="text">
     <string>PushButton</string>
    </property>
   </widget>
  </widget>
  <widget class="QMenuBar" name="menubar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>800</width>
     <height>23</height>
    </rect>
   </property>
  </widget>
  <widget class="QStatusBar" name="statusbar"/>
 </widget>
 <resources/>
 <connections>
  <connection>
   <sender>pushButton</sender>
   <signal>clicked()</signal>
   <receiver>MainWindow</receiver>
   <slot>click()</slot>
   <hints>
    <hint type="sourcelabel">
     <x>52</x>
     <y>59</y>
    </hint>
    <hint type="destinationlabel">
     <x>283</x>
     <y>201</y>
    </hint>
   </hints>
  </connection>
 </connections>
 <slots>
  <slot>click()</slot>
 </slots>
</ui>

You must convert to .py using the following command:

pyside2-uic design.ui -o design.py -x

design.py

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'design.ui',
# licensing of 'design.ui' applies.
#
# Created: Sun Aug 11 08:07:08 2019
#      by: pyside2-uic  running on PySide2 5.13.0
#
# WARNING! All changes made in this file will be lost!

from PySide2 import QtCore, QtGui, QtWidgets

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(800, 600)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(20, 20, 56, 17))
        self.pushButton.setObjectName("pushButton")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 23))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QObject.connect(self.pushButton, QtCore.SIGNAL("clicked()"), MainWindow.click)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        MainWindow.setWindowTitle(QtWidgets.QApplication.translate("MainWindow", "MainWindow", None, -1))
        self.pushButton.setText(QtWidgets.QApplication.translate("MainWindow", "PushButton", None, -1))


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_())

Also if you check the .py you will find the message: WARNING! All changes made in this file will be lost!, So instead of writing the logic in design.py you must create another .py file where the logic is implemented:

main.py

from PySide2 import QtCore, QtGui, QtWidgets

from design import Ui_MainWindow


class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.setupUi(self)

    @QtCore.Slot()
    def click(self):
        print("Button is clicked")


if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())
├── design.py
└── main.py
answered on Stack Overflow Aug 11, 2019 by eyllanesc

User contributions licensed under CC BY-SA 3.0