zhiyiYo / PyQt-Fluent-Widgets

A fluent design widgets library based on C++ Qt/PyQt/PySide. Make Qt Great Again.
https://qfluentwidgets.com
GNU General Public License v3.0
5.61k stars 541 forks source link

ToolButton not supported ToolButtonStyle #382

Closed immiProgrammer closed 11 months ago

immiProgrammer commented 1 year ago

image

import sys
from typing import Union

from PyQt5.QtCore import Qt
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QApplication, QWidget, QAction, QGridLayout, QToolButton

from qfluentwidgets import FluentIconBase, qconfig, ToolButton, RoundMenu, CommandButton
from qfluentwidgets import FluentIcon as FIF

class CToolButton(ToolButton):

    _icon = None # it is important to stop update on parent class
    __icon = None

    def setIcon(self, icon: Union[QIcon, str, FluentIconBase], disconnect=True): # immi
        # self._icon = None

        if isinstance(icon, FluentIconBase):
            self.__icon = icon
            icon = icon.icon()
            qconfig.themeChanged.connect(self._setIcon)

        elif disconnect:
            self.__icon = None
            try: # when it is connected
                qconfig.themeChanged.disconnect(self._setIcon)
            except:pass # when it is not Connected

            if isinstance(icon, str):
                icon = QIcon(icon)

        QToolButton.setIcon(self, icon)

    def _setIcon(self):
        if self.__icon:
            self.setIcon(self.__icon.icon(), False)

class ToolButtonDemo(QWidget):

    def __init__(self):
        super().__init__()
        # setTheme(Theme.DARK)
        self.setStyleSheet("ToolButtonDemo{background: white}")

        self.menu = RoundMenu(parent=self)
        self.menu.addAction(QAction(FIF.SEND_FILL.icon(), 'Send'))
        self.menu.addAction(QAction(FIF.SAVE.icon(), 'Save'))

        # tool button
        self.toolButton = ToolButton(FIF.SETTING, self)
        self.toolButton.setText("imran")
        self.toolButton.setToolButtonStyle(Qt.ToolButtonTextUnderIcon)

        self.toolButton1 = CommandButton(self)
        self.toolButton1.setText("imran")
        self.toolButton1.setToolButtonStyle(Qt.ToolButtonTextUnderIcon)
        self.toolButton1.setIcon(FIF.SETTING)

        self.toolButton2 = CToolButton(FIF.SETTING, self)
        self.toolButton2.setText("imran")
        self.toolButton2.setToolButtonStyle(Qt.ToolButtonTextUnderIcon)
        # self.toolButton1.setIcon(FIF.SETTING)

        self.toolButton3 = QToolButton(self)
        self.toolButton3.setObjectName('customToolButton')
        self.toolButton3.setText("imran")
        self.toolButton3.setIcon(FIF.SETTING.icon())
        self.toolButton3.setToolButtonStyle(Qt.ToolButtonTextUnderIcon)
        stylesheet = self.toolButton.styleSheet().replace('ToolButton', '#customToolButton')
        self.toolButton3.setStyleSheet(stylesheet)
        self.toolButton3.setFont(self.toolButton.font())

        # self.toolButton.setText("imran")
        # self.toolButton.setToolButtonStyle(Qt.ToolButtonTextOnly)

        # change the size of tool button
        # self.toolButton.resize(50, 50)
        # self.toolButton.setIconSize(QSize(30, 30))

        # add buttons to layout
        self.gridLayout = QGridLayout(self)
        self.gridLayout.addWidget(self.toolButton, 0, 0)
        self.gridLayout.addWidget(self.toolButton1, 0, 1)
        self.gridLayout.addWidget(self.toolButton2, 0, 2)
        self.gridLayout.addWidget(self.toolButton3, 1, 1)

        self.resize(300, 300)

if __name__ == '__main__':
    # enable dpi scale
    QApplication.setHighDpiScaleFactorRoundingPolicy(
        Qt.HighDpiScaleFactorRoundingPolicy.PassThrough)
    QApplication.setAttribute(Qt.AA_EnableHighDpiScaling)
    QApplication.setAttribute(Qt.AA_UseHighDpiPixmaps)

    app = QApplication(sys.argv)

    w1 = ToolButtonDemo()
    # w1.setWindowFlags(w1.windowFlags()|qt.CoverWindow)
    w1.show()
    # w1.move(50, 50)
    app.exec_()
zhiyiYo commented 1 year ago

Next version will add this feature

immiProgrammer commented 1 year ago

Next version will add this feature

Thanks