Python pyqt非模态对话框始终为模态
我在Qt Designer中设计了一个对话框,并将其设置为非模态,启动时总是模态的。我使用的是OS X El Capitan、Python3.5.1、Qt5.4.2和pyqt4 这些代码片段显示了我在做什么: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下尝试了这个方法,结果相同),或者我是否缺少某些设置
使用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()