pySide2和pyQt如何把界面置顶,放在最前面显示。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pySide2和pyQt如何把界面置顶,放在最前面显示。相关的知识,希望对你有一定的参考价值。

参考技术A pySide2 开发遇到这样的问题,当程序在运行时,被其他软件界面覆盖,弹窗无法弹到屏幕最前面。

问题解决办法:

如何创建一个新的窗口按钮 PySide/PyQt?

【中文标题】如何创建一个新的窗口按钮 PySide/PyQt?【英文标题】:How to create a new window button PySide/PyQt? 【发布时间】:2011-12-12 17:22:24 【问题描述】:

我在使用 Python 2.7 的 PyQt4/PySide 中的“新窗口”功能时遇到问题。我连接了一个initNewWindow() 函数,以创建一个新窗口、一个动作并将其放在菜单栏中。曾经是桌面软件中的常用功能。新窗口弹出并关闭,而不是在另一个窗口旁边给我一个新的持久窗口。我正在处理的代码是专有的,因此我创建了一个示例,该示例在下面执行相同的操作,但出现相同的错误。有什么办法可以让它工作吗?使用 Python 2.7 在 PySide 中运行。它是在 Windows 中编写和测试的。

from PySide.QtCore import QSize
from PySide.QtGui import QAction
from PySide.QtGui import QApplication
from PySide.QtGui import QLabel
from PySide.QtGui import QMainWindow
from PySide.QtGui import QMenuBar
from PySide.QtGui import QMenu
from sys import argv

def main():
    application = QApplication(argv)
    window = QMainWindow()
    window.setWindowTitle('New Window Test')
    menu = QMenuBar(window)
    view = QMenu('View')
    new_window = QAction('New Window', view)
    new_window.triggered.connect(initNewWindow)
    view.addAction(new_window)
    menu.addMenu(view)
    label = QLabel()
    label.setMinimumSize(QSize(300,300))
    window.setMenuBar(menu)
    window.setCentralWidget(label)
    window.show()
    application.exec_()


def initNewWindow():
   window = QMainWindow()
   window.setWindowTitle('New Window')
   window.show() 


if __name__ == '__main__':
   main()

【问题讨论】:

【参考方案1】:

如果一个函数创建了一个应用程序需要继续使用的 PyQt 对象,您必须确保以某种方式保留对它的引用。否则,它可能会在函数返回后立即被 Python 垃圾收集器删除。

所以要么给对象一个父对象,要么把它作为其他对象的属性。 (原则上,也可以将对象设为全局变量,但这通常被认为是不好的做法。

这是您的示例脚本的修订版本,演示了如何解决您的问题:

from PySide import QtGui, QtCore

class Window(QtGui.QMainWindow):
    def __init__(self):
        QtGui.QMainWindow.__init__(self)
        menu = self.menuBar().addMenu(self.tr('View'))
        action = menu.addAction(self.tr('New Window'))
        action.triggered.connect(self.handleNewWindow)

    def handleNewWindow(self):
        window = QtGui.QMainWindow(self)
        window.setAttribute(QtCore.Qt.WA_DeleteOnClose)
        window.setWindowTitle(self.tr('New Window'))
        window.show()
        # or, alternatively
        # self.window = QtGui.QMainWindow()
        # self.window.setWindowTitle(self.tr('New Window'))
        # self.window.show()

if __name__ == '__main__':

    import sys
    app = QtGui.QApplication(sys.argv)
    window = Window()
    window.resize(300, 300)
    window.show()
    sys.exit(app.exec_())

【讨论】:

【参考方案2】:

initNewWindow() 返回时,window 变量被删除,窗口的引用计数降至零,导致新创建的 C++ 对象被删除。这就是您的窗口立即关闭的原因。

如果您想保持打开状态,请确保保留参考。最简单的方法是让您的新窗口成为调用窗口的子窗口,并设置其WA_DeleteOnClose 小部件属性(请参阅Qt::WidgetAttribute)。

【讨论】:

也许你的意思是,WA_DeleteOnClose @JohnDoe:是的,当然。将其与WA_SantaClause 混淆了...谢谢 ;)

以上是关于pySide2和pyQt如何把界面置顶,放在最前面显示。的主要内容,如果未能解决你的问题,请参考以下文章

google浏览器总在最前面,怎么取消总是置顶

如何将 PyQt QProcess 窗口置于前面?

如何在 PyQt5 / PySide2 中从一个类访问属性到另一个类

如何断开 PySide2 中的按钮单击信号?

matlab 界面设计中怎么把axes放在最上层

在 PyQt5 和 PySide2 中覆盖paintEvent