Search code examples
iconspyqtgraphdock

How to define the icon of a Dock in pyqtgraph?


In pyqtgraph, Docks can be torn out of the DockArea by dragging or double clicking. The popups use a default icon. I would like to define my own icon. In the code below I set the application window. The same code has no effect on the dock, though there is no error message.

import sys
from PyQt5.QtWidgets import QWidget, QApplication, QVBoxLayout
from pyqtgraph.dockarea import Dock, DockArea
from PyQt5.QtGui import QIcon

class Foo(QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)        
        self.setWindowIcon(QIcon('direction'))
        lay = QVBoxLayout(self)        
        da = DockArea()
        d = Dock("Dock")
        d.setWindowIcon(QIcon('direction')) # no effect
        da.addDock(d)
        lay.addWidget(da)
        
if __name__ == "__main__":
    app = QApplication(sys.argv)
    w = Foo()
    w.show()
    sys.exit(app.exec_())

Solution

  • I looked in the source code of Dock and DockArea of pyqtgraph and found out I had to overwrite floatDock function.

    I created a function

    def floatDockPatched(self, dock):
        """Removes *dock* from this DockArea and places it in a new window."""
        area = self.addTempArea()
        area.win.resize(dock.size())
        area.win.setWindowIcon(QIcon("res/haip.png"))
        area.win.setWindowTitle(dock.label.text())
        area.moveDock(dock, 'top', None)
    

    and assigned it to the class as overwrite

    DockArea.floatDock = floatDockPatched