0

I use pyqt designer to generate UI. I opened a dialog from within a main window and unable to raise dialog event. I have done enough to reproduce my issue here.

full code here.

from PyQt5 import QtCore, QtGui, QtWidgets
import Ui_subwindow


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.verticalLayoutWidget = QtWidgets.QWidget(self.centralwidget)
        self.verticalLayoutWidget.setGeometry(QtCore.QRect(410, 130, 160, 80))
        self.verticalLayoutWidget.setObjectName("verticalLayoutWidget")
        self.verticalLayout = QtWidgets.QVBoxLayout(self.verticalLayoutWidget)
        self.verticalLayout.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout.setObjectName("verticalLayout")
        self.main_test = QtWidgets.QPushButton(self.verticalLayoutWidget)
        self.main_test.setObjectName("main_test")
        self.verticalLayout.addWidget(self.main_test)
        self.dialog = QtWidgets.QDialog()
        MainWindow.setCentralWidget(self.centralwidget)
        self.main_test.clicked.connect(self.show_dialog)
        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.main_test.setText(_translate("MainWindow", "open dialog"))

    def show_dialog(self):
        dui = Ui_subwindow.Ui_Dialog()
        dui.setupUi(self.dialog)
        self.dialog.show()


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

in dialog i used a raise event as followed

from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_Dialog(object):
    def setupUi(self, Dialog):
        Dialog.setObjectName("Dialog")
        Dialog.resize(400, 300)
        self.gridLayoutWidget = QtWidgets.QWidget(Dialog)
        self.gridLayoutWidget.setGeometry(QtCore.QRect(160, 110, 160, 80))
        self.gridLayoutWidget.setObjectName("gridLayoutWidget")
        self.gridLayout = QtWidgets.QGridLayout(self.gridLayoutWidget)
        self.gridLayout.setContentsMargins(0, 0, 0, 0)
        self.gridLayout.setObjectName("gridLayout")
        self.sub_test = QtWidgets.QPushButton(self.gridLayoutWidget)
        self.sub_test.setObjectName("sub_test")
        self.gridLayout.addWidget(self.sub_test, 0, 0, 1, 1)
        self.sub_test.clicked.connect(self.raised)
        self.retranslateUi(Dialog)
        QtCore.QMetaObject.connectSlotsByName(Dialog)

    def retranslateUi(self, Dialog):
        _translate = QtCore.QCoreApplication.translate
        Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
        self.sub_test.setText(_translate("Dialog", "raise console"))

    def raised(self):
        print("raised")

In the following pieces i have added methods event listeners that fire when invoked seperately. but not when a window is connected to the other.

file names: Ui_main.py and Ui_subwindow.py

eyllanesc
  • 235,170
  • 19
  • 170
  • 241

1 Answers1

1

The problem is that dui is a local variable that would be eliminated because the raised function can not be called, the solution is to make dui an attribute of the class.

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.verticalLayoutWidget = QtWidgets.QWidget(self.centralwidget)
        self.verticalLayoutWidget.setGeometry(QtCore.QRect(410, 130, 160, 80))
        self.verticalLayoutWidget.setObjectName("verticalLayoutWidget")
        self.verticalLayout = QtWidgets.QVBoxLayout(self.verticalLayoutWidget)
        self.verticalLayout.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout.setObjectName("verticalLayout")
        self.main_test = QtWidgets.QPushButton(self.verticalLayoutWidget)
        self.main_test.setObjectName("main_test")
        self.verticalLayout.addWidget(self.main_test)

        self.dialog = QtWidgets.QDialog()
        self.dui = Ui_subwindow.Ui_Dialog() # <--- add self.
        self.dui.setupUi(self.dialog) # <---

        MainWindow.setCentralWidget(self.centralwidget)
        self.main_test.clicked.connect(self.show_dialog)
        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.main_test.setText(_translate("MainWindow", "open dialog"))

    def show_dialog(self):
        self.dialog.show() 
eyllanesc
  • 235,170
  • 19
  • 170
  • 241
  • can i get anymore reading on when to use self in pyqt apps.I was confused that my dialog was an attribute of class. anyway Thanks to you. – srinath samala Nov 06 '18 at 05:24
  • @srinathsamala that has nothing to do with PyQt but with python, I recommend reading about OOP, do you know about OOP ?, if you do not know it you start badly with PyQt, you must have an intermediate knowledge of the subject, you could read beginning reading: https://stackoverflow.com/questions/2709821/what-is-the-purpose-of-self – eyllanesc Nov 06 '18 at 05:26