【问题标题】:PyQt4 How keep a QWidget always on top?PyQt4 如何保持 QWidget 始终在顶部?
【发布时间】:2018-11-26 06:49:14
【问题描述】:

我在 Windows7 上使用 PyQt4 和 python 2.7

我有一个 QWidget,我希望在单击主窗口时保持在 QMainWindow 上方。这个想法是主将包含一系列“编辑”按钮,这些按钮将打开编辑小部件,而编辑小部件会使用主中包含的信息进行刷新。只要小部件保持在主窗口的前面,我并不特别关心是否“始终在顶部”。

有几个问题可以解决这个主题,但我没有看到适用于我的特定用例的答案。一个处理小部件,但只为应用程序主窗口提供答案(小部件停留在其他环境窗口之上,但在单击主窗口时落在应用程序主窗口后面),另一个处理 Qt,但不是 Pythonic 示例:

PyQt: Always on top

How keep a QWidget always on top?

这是我目前的代码:

from PyQt4 import QtCore, QtGui

class Ui_MainWindow(QtGui.QMainWindow):
    def __init__(self):
        QtGui.QMainWindow.__init__(self, None, QtCore.Qt.WindowStaysOnTopHint)
        self.setWindowTitle("MainWindow")
        self.resize(400, 300)

class Ui_Widget(QtGui.QWidget):
    def __init__(self):
        QtGui.QWidget.__init__(self, None, QtCore.Qt.WindowStaysOnTopHint)
        self.setWindowTitle("Widget")
        self.resize(400, 300)

if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    MainWindow = Ui_MainWindow()
    MainWindow.show()
    Widget = Ui_Widget()
    Widget.show()
    sys.exit(app.exec_())

【问题讨论】:

  • 据我了解,您希望 Ui_Widget 始终位于 Ui_MainWindow 之上,例如 Google Chrome 之类的另一个窗口可以位于两者之上。
  • @eyllanesc 正确,只要小部件位于主窗口的前面,我并不特别需要 Chrome 位于主窗口的前面或后面。您在下面的答案完美地满足了这一点。再次感谢!

标签: python pyqt pyqt4 qwidget


【解决方案1】:

如果您希望Ui_Widget 始终位于Ui_MainWindow 之上,则Ui_Widget 必须是Ui_MainWindow 的子级,并且必须激活标志Qt::Dialog,如下所示:

from PyQt4 import QtCore, QtGui

class Ui_MainWindow(QtGui.QMainWindow):
    def __init__(self):
        QtGui.QMainWindow.__init__(self)
        self.setWindowTitle("MainWindow")
        self.resize(400, 300)

class Ui_Widget(QtGui.QWidget):
    def __init__(self,  parent=None):
        QtGui.QWidget.__init__(self, parent)
        self.setWindowFlags(self.windowFlags() | QtCore.Qt.Dialog)
        self.setWindowTitle("Widget")
        self.resize(400, 300)
        self.move(200, 150)

if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    MainWindow = Ui_MainWindow()
    MainWindow.show()
    Widget = Ui_Widget(MainWindow)
    Widget.show()
    sys.exit(app.exec_())

【讨论】:

  • 太棒了,谢谢!我之前尝试设置了父子关系,但没有得到我想要的结果,所以这解释了原因。您能否提供一些背景解释来解释为什么必须设置 Qt::Dialog 标志,或者指出我应该看的地方?
  • 太好了,非常感谢!
猜你喜欢
  • 2011-06-24
  • 2021-12-09
  • 1970-01-01
  • 1970-01-01
  • 2015-02-08
  • 1970-01-01
  • 2010-10-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多