J. D.
J. D.

Reputation: 171

PyQT: Exit/Complete Second Window Before First Window

I have the following code below:

from PyQt4 import QtGui
import sys


class Second(QtGui.QWidget):

    def __init__(self, parent=None):
        super(Second, self).__init__(parent)

        self.grid = QtGui.QGridLayout(self)
        self.setGeometry(650,400,400,200)
        self.widget = QtGui.QWidget()


class First(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(First, self).__init__(parent)

        self.grid = QtGui.QGridLayout(self)
        self.setGeometry(350, 200, 1000, 700)
        self.widget = QtGui.QWidget()

        Button1 = QtGui.QPushButton('...', self)
        Button1.clicked.connect(self.on_pushButton_clicked)
        self.grid.addWidget(Button1, 0, 0, 1, 1)


    def on_pushButton_clicked(self):
        self.Second = Second()
        self.Second.setWindowTitle('Window')
        self.Second.show()


def main():
    app = QtGui.QApplication(sys.argv)
    main = First()
    main.show()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

When I click the button, I want to be able to finish up my action in the second window before continuing on the first. Right now, I can exit out of my first window and the second window remains open. How do you keep on the second window but keep the first window unselectable?

Upvotes: 1

Views: 272

Answers (1)

eyllanesc
eyllanesc

Reputation: 244282

There are 2 possible solutions:

- Second must inherit from QDialog, pass it as parent to the first window and use exec_() instead of show:

class Second(QtGui.QDialog):
    def __init__(self, parent=None):
        super(Second, self).__init__(parent)

class First(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(First, self).__init__(parent)        
        self.setGeometry(350, 200, 1000, 700)
        self.widget = QtGui.QWidget()
        self.setCentralWidget(self.widget)
        grid = QtGui.QGridLayout(self.widget)
        Button1 = QtGui.QPushButton('...', self)
        Button1.clicked.connect(self.on_pushButton_clicked)
        grid.addWidget(Button1, 0, 0, 1, 1)

    @QtCore.pyqtSlot()
    def on_pushButton_clicked(self):
        self.Second = Second(self)
        self.Second.setWindowTitle('Window')
        self.Second.exec_()

- Change the windowModality to Qt::WindowModal, activate the flag Qt::Dialog and pass it the first window as parent.

class Second(QtGui.QWidget):
    def __init__(self, parent=None):
        super(Second, self).__init__(parent)
        self.setWindowModality(QtCore.Qt.WindowModal)
        self.setWindowFlags(self.windowFlags() | QtCore.Qt.Dialog)

class First(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(First, self).__init__(parent)        
        self.setGeometry(350, 200, 1000, 700)
        self.widget = QtGui.QWidget()
        self.setCentralWidget(self.widget)
        grid = QtGui.QGridLayout(self.widget)
        Button1 = QtGui.QPushButton('...', self)
        Button1.clicked.connect(self.on_pushButton_clicked)
        grid.addWidget(Button1, 0, 0, 1, 1)

    @QtCore.pyqtSlot()
    def on_pushButton_clicked(self):
        self.Second = Second(self)
        self.Second.setWindowTitle('Window')
        self.Second.show()

Upvotes: 1

Related Questions