简体   繁体   English

如何在 QPushButton 中移动图标内的文本?

[英]How do I move the text inside the icon in a QPushButton?

I have created custom PyQt5 buttons that have an SVG icon.我创建了具有 SVG 图标的自定义 PyQt5 按钮。 I to have clickable hexagons with text inside them.我有可点击的六边形,里面有文字。 However, when I try to move the text to the left, it is hidden by the hexagon.但是,当我尝试将文本向左移动时,它被六边形隐藏了。

I have tried moving the text to the left using padding, but this just hides the text.我尝试使用填充将文本向左移动,但这只是隐藏了文本。

HexButton code: HexButton 代码:

class HexButton(QPushButton):
    def __init__(self, colour, parent=None):
        super(QPushButton, self).__init__(parent)

        # Convert hexagon svg into image
        qimage = QtGui.QImage.fromData(self.svg_hexagon(colour))
        qicon = QtGui.QPixmap(qimage)
        # Set the icon as the hexagon
        self.setIcon(QtGui.QIcon(qicon))
        # Set icon size as the entire thing
        self.setIconSize(QSize(48, 48))
        # Make the button invisible
        self.setStyleSheet("""
        border: none;""")


    def svg_hexagon(self, colour):
        svg_bytes = f'<svg xmlns="http://www.w3.org/2000/svg" width="31" height="31"><path stroke="none" fill="{COLOURS[colour]}" d="M12.5 1.2320508075689a6 6 0 0 1 6 0l7.856406460551 4.5358983848622a6 6 0 0 1 3 5.1961524227066l0 9.0717967697245a6 6 0 0 1 -3 5.1961524227066l-7.856406460551 4.5358983848622a6 6 0 0 1 -6 0l-7.856406460551 -4.5358983848623a6 6 0 0 1 -3 -5.1961524227066l0 -9.0717967697245a6 6 0 0 1 3 -5.1961524227066"></path></svg>'
        return bytearray(svg_bytes, encoding='utf-8')

MainApplication主要应用

def main():

    app = QApplication(sys.argv)
    window = QWidget()
    layout = QHBoxLayout(window)

    button = HexButton("blank")
    button.setText("Nice")
    button.move(10, 10)
    layout.addWidget(button)

    window.show()
    sys.exit(app.exec_())

I expect a yellow hexagon with text inside.我期待一个黄色的六边形,里面有文字。

Unfortunately, the icon and text are painted on the same layer, and the icon is painted after the text causing the problem you are pointing out.不幸的是,图标和文本绘制在同一层上,并且图标绘制在导致您指出的问题的文本之后。 Considering the above a possible solution is to create a QLabel above the button:考虑到上述可能的解决方案是在按钮上方创建一个 QLabel:

from PyQt5 import QtCore, QtGui, QtWidgets


class HexButton(QtWidgets.QPushButton):
   def __init__(self, colour, parent=None):
       super(HexButton, self).__init__(parent)

       # Convert hexagon svg into image
       qimage = QtGui.QImage.fromData(self.svg_hexagon(colour))
       qicon = QtGui.QPixmap(qimage)
       # Set the icon as the hexagon
       self.setIcon(QtGui.QIcon(qicon))
       # Set icon size as the entire thing
       self.setIconSize(QtCore.QSize(48, 48))
       # Make the button invisible
       self.setStyleSheet(
           """
       border: none;"""
       )
       self.text_label = QtWidgets.QLabel()
       self.text_label.setContentsMargins(0, 0, 0, 0)
       self.text_label.setStyleSheet("""color : white;""")
       lay = QtWidgets.QVBoxLayout(self)
       lay.addWidget(self.text_label, alignment=QtCore.Qt.AlignCenter)

   def svg_hexagon(self, colour):
       svg_bytes = f'<svg xmlns="http://www.w3.org/2000/svg" width="31" height="31"><path stroke="none" fill="{colour.name()}" d="M12.5 1.2320508075689a6 6 0 0 1 6 0l7.856406460551 4.5358983848622a6 6 0 0 1 3 5.1961524227066l0 9.0717967697245a6 6 0 0 1 -3 5.1961524227066l-7.856406460551 4.5358983848622a6 6 0 0 1 -6 0l-7.856406460551 -4.5358983848623a6 6 0 0 1 -3 -5.1961524227066l0 -9.0717967697245a6 6 0 0 1 3 -5.1961524227066"></path></svg>'
       return bytearray(svg_bytes, encoding="utf-8")

   @property
   def text(self):
       return self.text_label.text()

   @text.setter
   def text(self, t):
       self.text_label.setText(t)


def main():
   import sys

   app = QtWidgets.QApplication(sys.argv)
   window = QtWidgets.QWidget()
   layout = QtWidgets.QHBoxLayout(window)

   button = HexButton(QtGui.QColor("black"))
   button.text = "Nice"
   layout.addWidget(button)

   window.show()
   sys.exit(app.exec_())


if __name__ == "__main__":
   main()

在此处输入图像描述

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM