关于 PyQt5 非模态对话框的顶置问题
PyQt5程序中的非模态对话框第一次打开时是顶置的,但被别的窗口遮盖之后,无法简单地重新顶置,除非从遮挡它的窗口后面找到它并用鼠标单击。在程序中,重新使用show方法并不会将其带到界面的最前面。虽然可以用raise_或SetWindowFlags方法让其顶置,但如果不作别的处理,它就总是顶置,直到关闭。我们试用了两种方式来解决这个问题。
第一种方式是用SetWindowFlags设置对话框标志后再重新显示的方式来解决这个问题,使用PyQt5的Python样例程序如下:
from PyQt5 import QtCore
......
def show_port_config(self):
self.PortConfBrowserW.setWindowFlags(QtCore.Qt.WindowStaysOnTopHint)
self.PortConfBrowserW.show()
self.PortConfBrowserW.setWindowFlags(QtCore.Qt.Widget)
self.PortConfBrowserW.show()
这里,show_port_config是主窗口对象中的一个槽函数,可以由一个按钮(例如“显示”按钮)或其他方式触发,显示其中一个名为PortConfBrowserW的非模态对话框实例成员。
第一个setWindowFlags是将对话框设置为顶置,然后用show将其显示出来。这时,如果没有下面的操作,这个对话框永远显示在最上面;而第二个setWindowFlags就是将恢复其可以被别的窗口遮盖的特性,并重新显示。这时,对话框仍然在最前面。
当这个对话框被别的窗口遮盖以后,如果再按一次“显示”按钮,重新调用这个槽函数,又可以把这个对话框带到最前面,并再恢复到可以被别的窗口遮盖的状态。
还有一种方式更为简单:进入槽函数时,先判断这个对话框是否已打开,如果已打开,就将其关闭,然后再打开;如果没被打开,则直接打开即可。具体程序就不在此赘述了。