Jacob Birkett
Jacob Birkett

Reputation: 2125

Use separate interface file with PyQt

I have an interface file generated from QtDesigner that I want to keep the same in case of changes.

Have a main file called application.py handle all the functions, and one file strictly for interface stuff.

I am using PyQt5.

I have not been able to find any tutorials on this specific question, any pointers would be helpful.

Code from YatsiInterface.py (shorten)

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_YatsiWindow(object):

    def setupUi(self, YatsiWindow):
        YatsiWindow.setObjectName("YatsiWindow")
        YatsiWindow.resize(800, 516)
        icon = QtGui.QIcon()
        icon.addPixmap(QtGui.QPixmap("Terraria.ico"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        YatsiWindow.setWindowIcon(icon)
        self.windowLayout = QtWidgets.QWidget(YatsiWindow)
        self.windowLayout.setObjectName("windowLayout")
        self.horizontalLayout = QtWidgets.QHBoxLayout(self.windowLayout)
        self.quitButton.setObjectName("quitButton")
        self.buttonsLeftLayout.addWidget(self.quitButton)
        YatsiWindow.setCentralWidget(self.windowLayout)
        self.statusbar = QtWidgets.QStatusBar(YatsiWindow)
        self.statusbar.setObjectName("statusbar")
        YatsiWindow.setStatusBar(self.statusbar)

        self.retranslateUi(YatsiWindow)
        QtCore.QMetaObject.connectSlotsByName(YatsiWindow)

    def retranslateUi(self, YatsiWindow):
        _translate = QtCore.QCoreApplication.translate
        YatsiWindow.setWindowTitle(_translate("YatsiWindow", "Yatsi - Server Interface"))
        self.quitButton.setText(_translate("YatsiWindow", "Quit"))

How can I use self.quitButton.clicked.connect(QtCore.QCoreApplication.instance().quit()) with the above code? I know to import the file with from YatsiInterface import Ui_YatsiWindow but I'm in the dark as how to create button functions without editing the interface file.

Edit:

I'll add my broken code below.

import sys
from YatsiInterface import Ui_YatsiWindow
from PyQt5 import QtCore, QtGui, QtWidgets

app = QtWidgets.QApplication([])
YatsiWindow = QtWidgets.QMainWindow()
ui = Ui_YatsiWindow()

ui.setupUi(YatsiWindow)
# Here's the bad part
ui.setupUi.btn.clicked.connect(QtCore.QCoreApplication.instance().quit)
# Up there ^

YatsiWindow.show()
sys.exit(app.exec_())

Thanks for your help.

Upvotes: 0

Views: 251

Answers (2)

Anuj Bhasin
Anuj Bhasin

Reputation: 610

from YatsiInterface import Ui_YatsiWindow
from PyQt5 import QtCore, QtGui

class my_application(QtGui.QWidget, Ui_YatsiWindow):

    def __init__(self):
        super(my_application, self).__init__()
        self.setupUi(self)
        self.quitButton.clicked.connect(self.my_mythod)

    def my_method(self):
        pass #all your code for the buttons clicked signal

if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    ui = my_application()
    ui.show()
    sys.exit(app.exec_())

This my_application class is inheriting your user interface class. Now, you can write your button related functions without editing the user interface file.

self.quitButton.clicked.connect(self.close) 

this will close your user interface when button is clicked.

Upvotes: 1

Brendan Abel
Brendan Abel

Reputation: 37549

This would be the way to connect the signal

ui.quitButton.clicked.connect(QtCore.QCoreApplication.instance().quit)

That being said, you probably don't want to do this. You should probably connect to the .close method of the window. When the window closes, by default, Qt will exit the event loop and quit.

ui.quitButton.clicked.connect(YatsiWindow.close)

Upvotes: 2

Related Questions