python - PyQT:在第一个窗口之前退出/完成第二个窗口

标签 python pyqt pyqt4

我有以下代码:

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

当我单击按钮时,我希望能够在第二个窗口中完成操作,然后再继续第一个窗口。现在,我可以退出第一个窗口,第二个窗口保持打开状态。如何保留第二个窗口但保持第一个窗口不可选择?

最佳答案

有两种可能的解决方案:

- 第二个窗口必须继承自 QDialog,将其作为父窗口传递给第一个窗口,并使用 exec_() 而不是 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_()

- 将 windowModality 更改为 Qt::WindowModal,激活标志 Qt::Dialog 并将其传递给第一个窗口作为家长。

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

关于python - PyQT:在第一个窗口之前退出/完成第二个窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54890278/

相关文章:

python - child 大小改变后缩小 parent 小部件

python - 无法理解 PyQt 中的一行代码

python - PyQT4:为什么当 setVisible(false) 时 QDialog 从 exec_() 返回

qt - 专注于 PyQt 中的 tabified QDockWidget

python - PyQt 4 - 全局名称 'SIGNAL' 未定义

python - 尝试访问从 Windows 复制的数据时,运行 Ubuntu 18 LTS 的 WSL2 上出现 Pyperclip 错误

python - 错误 :_pickle. PicklingError: Can't pickle <function <lambda> at 0x0000002F2175B048>: attribute lookup <lambda> on __main__ failed

python - pandas 两个 DatetimeIndex 之间的元素差异

python - ActionChains 中的 perform() 和 reset_actions() 不起作用 selenium python

python - 如何在动态创建的 QMdiAreaSubWindow 中处理 matplotlib pick Artist 事件? (给出的示例 - 部分工作!)