Python pyqt非模态对话框始终为模态

Python pyqt非模态对话框始终为模态,python,qt,pyqt4,Python,Qt,Pyqt4,我在Qt Designer中设计了一个对话框,并将其设置为非模态,启动时总是模态的。我使用的是OS X El Capitan、Python3.5.1、Qt5.4.2和pyqt4 这些代码片段显示了我在做什么: 使用pyuic将Designer.ui代码转换为python。 我给designer类下了一个子类 下面的注释代码显示了使其成为非模态的尝试,即使它应该是非模态的。什么都不管用。 我的环境中的pyqt4是否存在问题(我在Linux下尝试了这个方法,结果相同),或者我是否缺少某些设置

我在Qt Designer中设计了一个对话框,并将其设置为非模态,启动时总是模态的。我使用的是OS X El Capitan、Python3.5.1、Qt5.4.2和pyqt4

这些代码片段显示了我在做什么:


使用pyuic将Designer.ui代码转换为python。
我给designer类下了一个子类
下面的注释代码显示了使其成为非模态的尝试,即使它应该是非模态的。什么都不管用。
我的环境中的pyqt4是否存在问题(我在Linux下尝试了这个方法,结果相同),或者我是否缺少某些设置

演示:


因为个人喜好,我重新整理了一些代码(我相信你可以把它放回去,没问题),现在一个是模态的,另一个是非模态的

创建非模式窗口时,必须在QDialog类的实例化中提供父QWidget。然后,不要使用
QDialog.exec()
,而是使用
QDialog.show()
。这显示了非模态窗口,但在某种意义上允许原始父级保持运行。使用
exec\(
)将始终生成模式窗口,即使您将其设置为非模式。以下是文档:

代码如下:

class Dialog1(QDialog):
    def __init__(self):
        QDialog.__init__(self)
        self.setModal(True)


class Dialog2(QDialog):
    def __init__(self, parent):
    QDialog.__init__(self, parent)
    self.setModal(0)
    b1 = QPushButton("ok", self)
    b1.move(50, 50)
    b1.clicked.connect(self.exit)
    self.setWindowTitle("Nonmodal Dialog")

    self.show()

def exit(self):
    self.close()


def window():
    app = QApplication(sys.argv)
    w = QWidget()
    b = QPushButton(w)
    b.setText("Modal Dialog")
    b.move(15, 25)
    b.clicked.connect(showdialog1)

    c = QPushButton(w)
    c.setText("Nonmodal Dialog")
    c.move(15, 75)
    c.clicked.connect(lambda: showdialog2(w))

    w.setWindowTitle("PyQt Dialog demo")
    w.resize(200, 150)
    w.show()
    sys.exit(app.exec_())


def showdialog1():
    # d = QDialog()
    d = Dialog1()
    #d.setWindowModality(QtCore.Qt.Modal)
    b1 = QPushButton("Modal Dialog", d)
    b1.move(50, 50)
    d.setWindowTitle("Modal Dialog")
    d.setWindowModality(Qt.ApplicationModal)
    d.exec_()

def showdialog2(w):
    # d = QDialog()
    Dialog2(w)



if __name__ == '__main__':
    window()

因为个人喜好,我重新整理了一些代码(我相信你可以把它放回去,没问题),现在一个是模态的,另一个是非模态的

创建非模式窗口时,必须在QDialog类的实例化中提供父QWidget。然后,不要使用
QDialog.exec()
,而是使用
QDialog.show()
。这显示了非模态窗口,但在某种意义上允许原始父级保持运行。使用
exec\(
)将始终生成模式窗口,即使您将其设置为非模式。以下是文档:

代码如下:

class Dialog1(QDialog):
    def __init__(self):
        QDialog.__init__(self)
        self.setModal(True)


class Dialog2(QDialog):
    def __init__(self, parent):
    QDialog.__init__(self, parent)
    self.setModal(0)
    b1 = QPushButton("ok", self)
    b1.move(50, 50)
    b1.clicked.connect(self.exit)
    self.setWindowTitle("Nonmodal Dialog")

    self.show()

def exit(self):
    self.close()


def window():
    app = QApplication(sys.argv)
    w = QWidget()
    b = QPushButton(w)
    b.setText("Modal Dialog")
    b.move(15, 25)
    b.clicked.connect(showdialog1)

    c = QPushButton(w)
    c.setText("Nonmodal Dialog")
    c.move(15, 75)
    c.clicked.connect(lambda: showdialog2(w))

    w.setWindowTitle("PyQt Dialog demo")
    w.resize(200, 150)
    w.show()
    sys.exit(app.exec_())


def showdialog1():
    # d = QDialog()
    d = Dialog1()
    #d.setWindowModality(QtCore.Qt.Modal)
    b1 = QPushButton("Modal Dialog", d)
    b1.move(50, 50)
    d.setWindowTitle("Modal Dialog")
    d.setWindowModality(Qt.ApplicationModal)
    d.exec_()

def showdialog2(w):
    # d = QDialog()
    Dialog2(w)



if __name__ == '__main__':
    window()

删除所有不必要的代码。不要使用pyuic的结果,应该在几行手写代码中设置一个演示对话框。如果问题真的是你所说的,那么一个复制案例应该足够短,不能显示滚动条。用演示应用程序编辑文章。同样的问题。删除所有不必要的代码。不要使用pyuic的结果,应该在几行手写代码中设置一个演示对话框。如果问题真的是你所说的,那么一个复制案例应该足够短,不能显示滚动条。用演示应用程序编辑文章。同样的问题解决了@彼得旺非常感谢你的帮助@彼得旺非常感谢你的帮助。
   self.ui.orderPartButton.clicked.connect(lambda: self.orderPartButtonClicked())

#
# Parts Slots
#
#

@pyqtSlot()
def orderPartButtonClicked(self):
    selectedPart = MainWindow.ui.partShortagesTable.selectedItems()
    if (selectedPart):
        part = selectedPart[0].text()
        aPurchaseInfoDialog = PurchaseInfoDialog()
        pidUi = Ui_purchaseInfoDialog()
        pidUi.setupUi(aPurchaseInfoDialog)

    refreshPurchaseInfoTable(self, pidUi.purchaseInfoTable, pidUi.piPartLabel, pidUi.piPartdescriptionLabel, part, pathToArchive)

    #aPurchaseInfoDialog.setWindowModality(QtCore.Qt.NonModal)
    result = aPurchaseInfoDialog.exec_()  # Launch the Purchase Info Dialog. result = 0 for Close
    #aPurchaseInfoDialog.show()
import sys
from PyQt4 import QtCore
from PyQt4.QtCore import *
from PyQt4.QtGui import *



class Dialog1(QDialog):
    def __init__(self):
        QDialog.__init__(self)
        self.setModal(True)


class Dialog2(QDialog):
    def __init__(self):
        QDialog.__init__(self)
        self.setModal(False)



def window():
    app = QApplication(sys.argv)
    w = QWidget()
    b = QPushButton(w)
    b.setText("Modal Dialog")
    b.move(15, 25)
    b.clicked.connect(showdialog1)

    c = QPushButton(w)
    c.setText("Modless Dialog")
    c.move(15, 75)
    c.clicked.connect(showdialog2)

    w.setWindowTitle("PyQt Dialog demo")
    w.resize(200, 150)
    w.show()
    sys.exit(app.exec_())


def showdialog1():
    # d = QDialog()
    d = Dialog1()
    #d.setWindowModality(QtCore.Qt.Modal)
    b1 = QPushButton("Modal Dialog", d)
    b1.move(50, 50)
    d.setWindowTitle("Modal Dialog")
    d.setWindowModality(Qt.ApplicationModal)
    d.exec_()

def showdialog2():
    # d = QDialog()
    d = Dialog2()
    d.setWindowModality(QtCore.Qt.NonModal)
    b1 = QPushButton("ok", d)
    b1.move(50, 50)
    d.setWindowTitle("Modeless Dialog")
    d.setWindowModality(Qt.ApplicationModal)
    d.exec_()


if __name__ == '__main__':
    window()
class Dialog1(QDialog):
    def __init__(self):
        QDialog.__init__(self)
        self.setModal(True)


class Dialog2(QDialog):
    def __init__(self, parent):
    QDialog.__init__(self, parent)
    self.setModal(0)
    b1 = QPushButton("ok", self)
    b1.move(50, 50)
    b1.clicked.connect(self.exit)
    self.setWindowTitle("Nonmodal Dialog")

    self.show()

def exit(self):
    self.close()


def window():
    app = QApplication(sys.argv)
    w = QWidget()
    b = QPushButton(w)
    b.setText("Modal Dialog")
    b.move(15, 25)
    b.clicked.connect(showdialog1)

    c = QPushButton(w)
    c.setText("Nonmodal Dialog")
    c.move(15, 75)
    c.clicked.connect(lambda: showdialog2(w))

    w.setWindowTitle("PyQt Dialog demo")
    w.resize(200, 150)
    w.show()
    sys.exit(app.exec_())


def showdialog1():
    # d = QDialog()
    d = Dialog1()
    #d.setWindowModality(QtCore.Qt.Modal)
    b1 = QPushButton("Modal Dialog", d)
    b1.move(50, 50)
    d.setWindowTitle("Modal Dialog")
    d.setWindowModality(Qt.ApplicationModal)
    d.exec_()

def showdialog2(w):
    # d = QDialog()
    Dialog2(w)



if __name__ == '__main__':
    window()