在子窗口小部件处于活动状态时阻止QMainWindow,pyqt

时间:2014-03-14 16:26:29

标签: python qt pyqt4

我想当用户按下按钮时,在MainWindow被阻止等待填写表格后会出现一个表格

6 个答案:

答案 0 :(得分:8)

您不需要做其他答案所暗示的任何事情。使用任何exec()方法都是一种可靠的方法来获取错误,因为突然你的gui代码可以被重新输入。不要这样做。

您需要做的就是在显示之前设置正确的窗口模式 (这是重要的部分)。所以:

widget.setWindowModality(Qt.ApplicationModal)
widget.show()

如果您希望窗口仅阻止其他窗口,而不是整个应用程序:

widget.setWindowFlags(widget.windowFlags() | Qt.Window)
widget.setParent(otherWindow)
widget.setWindowModality(Qt.WindowModal)
widget.show()

请注意,此代码仅适用于PyQt4,它不支持Qt 5,窗口功能属于与QWidget不同的类。

答案 1 :(得分:4)

您需要使用QDialog并使用exec显示它,这将阻止应用程序的其余部分,直到它关闭。 exec的返回值还会告诉您表单是否已关闭而未提交更改(即已取消)。

这是一个简单的演示脚本,演示了如何使用QDialog

from PyQt4 import QtCore, QtGui

class Dialog(QtGui.QDialog):
    def __init__(self, parent=None):
        QtGui.QDialog.__init__(self, parent)
        self.checkbox1 = QtGui.QCheckBox('Option one', self)
        self.checkbox2 = QtGui.QCheckBox('Option two', self)
        self.buttonOk = QtGui.QPushButton('Ok', self)
        self.buttonOk.clicked.connect(self.accept)
        self.buttonCancel = QtGui.QPushButton('Cancel', self)
        self.buttonCancel.clicked.connect(self.reject)
        layout = QtGui.QGridLayout(self)
        layout.addWidget(self.checkbox1, 0, 0, 1, 2)
        layout.addWidget(self.checkbox2, 1, 0, 1, 2)
        layout.addWidget(self.buttonOk, 2, 0)
        layout.addWidget(self.buttonCancel, 2, 1)

class Window(QtGui.QMainWindow):
    def __init__(self):
        QtGui.QMainWindow.__init__(self)
        widget = QtGui.QWidget(self)
        layout = QtGui.QVBoxLayout(widget)
        self.button = QtGui.QPushButton('Show Dialog', self)
        self.button.clicked.connect(self.handleButton)
        layout.addWidget(self.button)
        self.setCentralWidget(widget)

    def handleButton(self):
        dialog = Dialog(self)
        if dialog.exec_() == QtGui.QDialog.Accepted:
            print('Option one: %s' % dialog.checkbox1.isChecked())
            print('Option two: %s' % dialog.checkbox2.isChecked())
        else:
            print('Cancelled')
        dialog.deleteLater()

if __name__ == '__main__':

    import sys
    app = QtGui.QApplication(sys.argv)
    window = Window()
    window.setGeometry(500, 300, 200, 100)
    window.show()
    sys.exit(app.exec_())

答案 2 :(得分:1)

这就是你需要的

self.setWindowModality(QtCore.Qt.ApplicationModal)

答案 3 :(得分:0)

使用表单将QDialog或QWidget子类化,然后在主窗口的构造中将其连接起来。您需要将此代码从c ++转换为python:

QObject::connect(myPushButton, SIGNAL(clicked), this, SLOT(on_myPushButton()));

//...

void MainWindow::on_myPushButton()
{
    Dialog d;
    int retVal = d.exec();// this is a blocking call
    // Here the user has finished filling out the form.
    // save any data that should be in the form, or respond to the retVal

}

编辑:添加了有关使用QDialog::exec()

的文档的链接

http://qt-project.org/doc/qt-5/qdialog.html#exec

希望有所帮助。

答案 4 :(得分:0)

好的,所以你想阻止父窗口直到子窗口关闭。

dialog = QInputDialog()
dialog.exec_()

使用exec_()函数,它将阻塞,直到子窗口未关闭

了解更多信息:

launch a PyQT window from a main PyQt window, and get the user input?

Python - make a window appear on top of another, block access to other windows until button clicked

答案 5 :(得分:0)

必须创建Widget继承自Qdialog

AjoutArBase, AjoutArForm = uic.loadUiType('ajoutArticle.ui')
class AjoutArticle(AjoutArBase,QtGui.QDialog):