【问题标题】:Setting custom title bar widget changes the windows flags on Windows设置自定义标题栏小部件会更改 Windows 上的 Windows 标志
【发布时间】:2015-02-13 14:47:42
【问题描述】:

我正在实现一个自定义小部件,以将其用作可停靠窗口上的标题栏。我的问题只出现在 Windows 上,即当停靠窗口浮动时,窗口边框消失。

似乎问题在于,仅在 Windows 上,窗口标志已更改。 IE。当我这样做时:

   print dock_window.windowFlags()
   dock_window.setTitleBarWidget(title_bar)
   print dock_window.windowFlags()

它为之前和之后的标志打印出不同的设置。 但是在 linux 上保持不变,边框保持不变。

我的问题是,如何恢复窗口边框?

更新:由于自定义标题栏会在停靠窗口浮动时覆盖边框的标志,我如何编辑停靠窗口使其具有某种边框? (停靠窗口在浮动时具有自定义标题栏至关重要。)

【问题讨论】:

    标签: python qt pyqt pyside qdockwidget


    【解决方案1】:

    根据answer,这是预期的行为。

    来自setTitleBarWidgetdocumentation

    如果设置了标题栏小部件,QDockWidget 将不会使用原生窗口 漂浮时的装饰品。

    那么 Linux 做错了吗?

    无论如何,作为 Windows 的一种解决方法,我从 PySide/PyQt 的答案中实现了这个想法(在浮动之前取消设置标题栏小部件)。

    from PySide import QtGui, QtCore
    
    class MyDockWidget(QtGui.QDockWidget):
    
        def __init__(self, title_widget):
            super().__init__()
            self.title_widget = title_widget
            self.toggle_title_widget(False)
            self.topLevelChanged.connect(self.toggle_title_widget)
    
        def toggle_title_widget(self, off):
            if off:
                self.setTitleBarWidget(None)
            else:
                self.setTitleBarWidget(self.title_widget)
    
    
    app = QtGui.QApplication([])
    
    w = QtGui.QMainWindow()
    t = QtGui.QLabel('Title')
    d = MyDockWidget(t)
    w.addDockWidget(QtCore.Qt.LeftDockWidgetArea, d)
    w.show()
    
    app.exec_()
    

    至少它在漂浮时保持标准的装饰。

    【讨论】:

    • 我已对我的原始问题添加了更新。当窗口浮动时,我有自定义标题栏是至关重要的。
    • 你找到解决办法了吗?
    【解决方案2】:

    我发现这是一个unresolved bug in QT,我认为这不是预期的行为。 我发现很多人在这个问题上绊倒eg1eg2 和其他人。

    • 有些人建议按照 Trilarion 的回答取消和设置 setTitleBarWidget。 但是,这会删除自定义标题栏,我不同意。
    • 其他人建议在 topLevelChanged 事件上设置标志:window.setWindowFlags(Qt::Window | Qt::FramelessWindowHint);。这会将通常的标题栏添加到停靠小部件,这又不是我个人想要的。
    • the best solution I found 是 w->setWindowFlags(Qt::Tool|Qt::CustomizeWindowHint);。这使用 Qt.CustomizeWindowHint 而不是 Qt.FramelessWindowHint 并且不会产生巨大的标题栏,而只是一个小栏。

    实施

    from PyQt5.QtCore import Qt
    ....
    def dockfloatevent(isfloating):
        if isfloating:
            dock.setWindowFlags(Qt.Tool | Qt.CustomizeWindowHint)
    dock.topLevelChanged.connect(dockfloatevent)
    

    我没有使用最新的 Qt,但据我所知这仍然是一个问题?如果有人有 Qt 帐户,可能会在上面的错误链接中发布一些内容?我已经在这上面浪费了很多时间,不想再推它了:|

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-28
      • 2013-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-30
      相关资源
      最近更新 更多