QDockWidget 隐藏标题栏

Posted

技术标签:

【中文标题】QDockWidget 隐藏标题栏【英文标题】:QDockWidget hide title bar 【发布时间】:2014-10-06 21:02:13 【问题描述】:

我找不到如何隐藏我的 Qdockwidgets 的标题栏:

我在参考文献中找到了这个:

QDockWidget.setTitleBarWidget (self, QWidget widget)

The widget argument has it's ownership transferred to Qt.

Sets an arbitrary widget as the dock widget's title bar. If widget is 0, any custom title bar widget previously set on the dock widget is removed, but not deleted, and the default title bar will be used instead.

这在很多地方:

dockWidget->setTitleBarWidget(new QWidget());

但是如何实际使用它们呢?我根本找不到任何简单的代码示例,即使在参考文献中也没有显示这些代码,而且我的所有尝试都以各种错误告终。 在整个页面中:http://pyqt.sourceforge.net/Docs/PyQt4/qdockwidget.html#setTitleBarWidget 根本没有什么可以告诉我如何使用它:

QDockWidget.setTitleBarWidget (self, QWidget widget)

如果我阅读了文档,我应该将“小部件”替换为 0,这样我就不会显示标题栏了

self.dockWdg1.setTitleBarWidget(self, QtGui.QWidget(0))# If I don't add QtGui in front of QWidget it don't know what is QWidget 

给我这个错误:

TypeError: QWidget(QWidget parent=None, Qt.WindowFlags flags=0): argument 1 has unexpected type 'int'

另一个问题,真的有人在使用这个引用吗:? http://pyqt.sourceforge.net/Docs/PyQt4/qdockwidget.html#setTitleBarWidget

我的问题可能看起来很奇怪,但我发现这些参考资料如此不完整(没有代码示例)并且解释如此模糊我真的想知道我是否正在寻找正确的问题,尤其是在另一边我们有这个时:http://srinikom.github.io/pyside-docs/PySide/QtGui/QDockWidget.html#PySide.QtGui.QDockWidget使用 pySide 似乎好得多。 PyQT 引用甚至比 MaxScript 引用更糟糕,这不是一件小事。

我的完整代码:

import sys, random
from PyQt4 import QtCore, QtGui
from PyQt4.QtGui import QPalette, QBrush, QPixmap





class MainWin(QtGui.QMainWindow):

     def __init__(self):
        super(MainWin, self).__init__()

        self.initUI()


     def initUI(self):


        #central widget
        self.theboard = Board(self)
        self.setCentralWidget(self.theboard)


          #dock1 Left Dock
        self.dockWdg1 = LeftDock(self)
        #Use SizeQWidget()  to define the initial size of QDockWidget
        self.content1 = SizeQWidget()
        self.dockWdg1.setWidget(self.content1)
        self.dockWdg1.setFeatures(self.dockWdg1.NoDockWidgetFeatures)
        self.addDockWidget(QtCore.Qt.LeftDockWidgetArea, self.dockWdg1)
        self.dockWdg1.setTitleBarWidget(self, QtGui.QWidget(0))# If I don't add QtGui in front of QWidget it don't know what is QWidget

        self.resize(360, 760)
        self.setWindowTitle('Test')
        self.show()



class LeftDock(QtGui.QDockWidget):

    def __init__(self, parent):
        super(LeftDock, self).__init__(parent)
        self.initLeftDock()


    def initLeftDock(self):

        self.setGeometry(300, 300, 200, 120)
        #self.setWindowTitle('LeftDock')




class Board(QtGui.QFrame):


    def __init__(self, parent):
        super(Board, self).__init__(parent)

        self.initBoard()

    def initBoard(self):

        print("ddd")


#Dummy QWidget used by QDockWidget for defining initial size.
class SizeQWidget(QtGui.QWidget):
       def sizeHint(self):
        return QtCore.QSize(100, 75)



def main():

    app = QtGui.QApplication([])
    mw = MainWin()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()

【问题讨论】:

【参考方案1】:

PyQt 文档是从 C++ 文档自动创建的。我总是只使用 C++ 文档。

因此,文档的整体质量不是很好。

现在谈谈你手头的主要问题。

注意QtGui.QWidgetQObject* 作为第一个参数(新创建对象的父对象)。另请注意,空指针在 Python 中由None 表示,而不是0

那么我们需要知道self通常是通过调用实例上的方法来隐式传递的。 (self 在 PyQt 的上下文中就像你在 Python 中遇到的所有其他 self)。

因此,这是可行的:

        self.dockWdg1.setTitleBarWidget(QtGui.QWidget(None))

我个人会做一些不同的事情:

        self.dockWdg1.setTitleBarWidget(QtGui.QWidget(self.dockWdg1))

也就是说,将标题栏小部件的父级设置为停靠小部件本身,保留一个不错的对象层次结构。

我还可能会说,通过将停靠小部件的标题栏小部件替换为不可见(大小为零)小部件来“移除”它浮动停靠小部件变得不可能

【讨论】:

我明白了,所以您使用原始 C++ 文档... for python ...?你有 C++ 背景吗?我承认我还没有认真看 C++ 的,我没想到它足够接近在 python 中有用,我下次一定会看看!正如您可能已经看到的那样,我对 python 很陌生,所以如果文档说“在这里放一个 0”,这正是我正在做的,现在我会通过“0”知道文档想说“null”哪个在 python 中表示“无”...谢谢!我不想让dockwidgets浮动我只是使用一个mainWindow来组织不同的静态面板彼此相邻:)非常感谢! 我收到了一条警告消息:QWidget::setMinimumSize: (/QDockWidget) 负尺寸 (0,-1) 是不可能的。除了这个警告,一切都很好。 是的,但不需要知道会写 C++。由于 API 大约 99.9 % 相同,因此主要用于查找函数名称及其参数,这主要是在没有更深入的 C++ 知识的情况下工作。 我在这里没有收到警告。 Python 3.4.1 / PyQt4.11.2。 好的,谢谢您对文档的建议。我现在将忽略此警告,因为无论如何代码都可以完美运行。再次感谢!【参考方案2】:

我用它把它们全部隐藏在 c++ 中

for (auto &dock:findChildren<QDockWidget*>())
  dock->setTitleBarWidget(new QWidget);

【讨论】:

以上是关于QDockWidget 隐藏标题栏的主要内容,如果未能解决你的问题,请参考以下文章

如何获取 QToolBar / QDockWidget 上下文菜单操作?

QDockWidget 启动时自动隐藏

返回已删除的 QDockWidget 标题栏以实现可拖动性

QDockWidget - QGlWidget - 当小部件从停靠栏中拖出时,可绘制无效

如何将最大化按钮添加到浮动 QDockWidget?

设置列表化QDockWidget选项卡的颜色