SS2
SS2

Reputation: 1

PyQt5 can't use pre defined widgets in separate ui file

I'm having a problem with PyQt5 where i have a separate ui file(still a python file not .ui) I'm trying to connect a button which would be located in that file however this doesn't work for me for some reason. Here's my code.

from PyQt5 import QtCore, QtGui, QtWidgets
from gui import Ui_Form

class Main(QtWidgets.QMainWindow):
    def __init__(self):
        super(Main, self).__init__()
        self.ui = Ui_Form()
        self.ui.setupUi(self)
        self.show()
        self.Ui_Form.exit.clicked.connect(self.handle)

    def handle(self):
        self.print("hello")

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    Form = QtWidgets.QWidget()
    ui = Ui_Form()
    ui.setupUi(Form)
    Form.show()
    sys.exit(app.exec_())

and here's some code from my auto generated gui file using pyuic:

self.exit = QtWidgets.QPushButton(Form)
self.exit.setGeometry(QtCore.QRect(375, 270, 115, 27))
self.exit.setObjectName("exit")

this same exact procedure has worked for me before in Qt4 so i don't see why it wouldn't work here?

Upvotes: 0

Views: 760

Answers (1)

eyllanesc
eyllanesc

Reputation: 244282

You must use the ui attribute to access the button. You must change:

self.Ui_Form.exit.clicked.connect(self.handle)

to:

self.ui.exit.clicked.connect(self.handle)

Note: Typically when using a Widget template, it names that element as a form and the design class as Ui_Form, so you should use QWidget as a class base.

Complete code:

class Main(QtWidgets.QWidget):
    def __init__(self):
        super(Main, self).__init__()
        self.ui = Ui_Form()
        self.ui.setupUi(self)
        self.show()
        self.ui.exit.clicked.connect(self.handle)

    def handle(self):
        self.print("hello")

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

Upvotes: 1

Related Questions