Pyside2如何打开对话框但并不总是在顶部
Posted
技术标签:
【中文标题】Pyside2如何打开对话框但并不总是在顶部【英文标题】:Pyside2 how to open the dialog but not always on top 【发布时间】:2017-11-17 15:03:21 【问题描述】:我创建了一个主框架和一个按钮,
并让按钮点击打开一个对话框,但对话框总是在顶部,
我尝试使用 setWindowsFlag 但不起作用。
from PySide2.QtWidgets import QApplication,QMainWindow,QTabWidget,QWidget
from PySide2.QtWidgets import QMessageBox,QFileDialog,QErrorMessage
from PySide2 import QtCore, QtGui, QtWidgets
class UI_Test20(object):
def setupUi(self, Test202):
Test202.setObjectName("Test202")
Test202.resize(100,100)
self.centralwidget = QtWidgets.QWidget(Test202)
self.centralwidget.setObjectName("centralwidget")
self.pb = QtWidgets.QPushButton(self.centralwidget)
self.pb.setText('push button!')
Test202.setCentralWidget(self.centralwidget)
self.pb.clicked.connect(self.btnClicked)
self.retranslateUi(Test202)
QtCore.QMetaObject.connectSlotsByName(Test202)
def retranslateUi(self, Test202):
Test202.setWindowTitle(QtWidgets.QApplication.translate("Test202", "MainWindow", None, -1))
def btnClicked(self):
ui = Ui_Dialog1(self)
ui.show()
class Test20(QMainWindow, UI_Test20) :
def __init__(self, parent):
super(Test20, self).__init__(parent)
self.setupUi(self)
和对话代码
class Ui_Dialog1(QtWidgets.QDialog):
def __init__(self, parent=None):
super(Ui_Dialog1, self).__init__(parent)
self.p = parent
self.setupUi(self)
def setupUi(self, Dialog1):
Dialog1.setObjectName("Dialog1")
Dialog1.resize(333, 173)
主要
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
ui = Test20(None)
ui.show()
sys.exit(app.exec_())
【问题讨论】:
【参考方案1】:问题是由于主窗口是QDialog
的父窗口,所以它必须被删除,但如果这样做了,垃圾收集器会删除它,所以QDialog
的成员必须上课:
def btnClicked(self):
self.ui = Ui_Dialog1()
self.ui.show()
另外:正确的做法是不要修改设计,所以我移动了与单击按钮 pb
关联的连接和插槽,如果我们希望它在窗口关闭时关闭,我们将覆盖closeEvent()
方法:
class Test20(QMainWindow, UI_Test20):
def __init__(self, parent):
super(Test20, self).__init__(parent)
self.setupUi(self)
self.pb.clicked.connect(self.btnClicked)
def btnClicked(self):
self.ui = Ui_Dialog1()
self.ui.show()
def closeEvent(self, *args, **kwargs):
self.ui.close()
QMainWindow.closeEvent(self, *args, **kwargs)
【讨论】:
非常感谢!另一个问题,我关闭了主框架,这个打开的对话框也应该关闭,我应该编写代码来关闭对话框吗? 是的,它会覆盖 closeEvent 方法并在该部分关闭对话框 谢谢我会试试的~ 我把那部分添加到我的答案中。 如果我按下右上角的关闭按钮,对话框中的某些工作仍在工作,(例如 QtCore.QTimer()),我该如何避免?以上是关于Pyside2如何打开对话框但并不总是在顶部的主要内容,如果未能解决你的问题,请参考以下文章
如何保证浏览器的页面中,在每次打开一个网页新窗口后,仍然让原来页面总是显示在最前面?
如何从任务栏菜单应用程序 Python/Pyside2 for MacOS 显示 Hello World 对话框