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

Python 如何在QPushButton中移动图标内的文本?,python,python-3.x,pyqt,pyqt5,qpushbutton,Python,Python 3.x,Pyqt,Pyqt5,Qpushbutton,我已经创建了带有SVG图标的自定义PyQt5按钮。我希望有可点击的六边形,里面有文字。但是,当我尝试向左移动文本时,它被六边形隐藏 我曾尝试使用填充将文本向左移动,但这只是隐藏了文本 HexButton代码: class HexButton(QPushButton): def __init__(self, colour, parent=None): super(QPushButton, self).__init__(parent) # Convert h

我已经创建了带有SVG图标的自定义PyQt5按钮。我希望有可点击的六边形,里面有文字。但是,当我尝试向左移动文本时,它被六边形隐藏

我曾尝试使用填充将文本向左移动,但这只是隐藏了文本

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')

我希望里面有文本的黄色六边形。

不幸的是,图标和文本绘制在同一层上,而图标是在导致您指出的问题的文本之后绘制的。考虑到上述情况,可能的解决方案是在按钮上方创建QLabel:

从PyQt5导入QtCore、QtGui、qtwidget
类HexButton(qtwidts.QPushButton):
定义初始值(自身、颜色、父项=无):
超级(六角按钮,自我)。\uuuu初始化\uuuuu(父级)
#将svg转换为图像
qimage=QtGui.qimage.fromData(self.svg_hexagon(彩色))
qicon=QtGui.QPixmap(qimage)
#将图标设置为六边形
self.setIcon(QtGui.QIcon(QIcon))
#将图标大小设置为整个内容
self.setIconSize(QtCore.QSize(48,48))
#使按钮不可见
自选表格(
"""
边框:无;“”“
)
self.text_label=qtwidts.QLabel()
self.text_label.setContentsMargins(0,0,0,0)
self.text_label.setStyleSheet(“”颜色:白色;“”)
lay=qtwidts.QVBoxLayout(self)
lay.addWidget(self.text\u标签,alignment=QtCore.Qt.AlignCenter)
def svg_六边形(自身,颜色):
svg_字节=f“”
返回bytearray(svg_字节,encoding=“utf-8”)
@财产
def文本(自我):
返回self.text_label.text()
@文本设置器
def文本(自我,t):
self.text_label.setText(t)
def main():
导入系统
app=qtwidts.QApplication(sys.argv)
window=qtwidts.QWidget()
layout=qtwidts.QHBoxLayout(窗口)
按钮=六角按钮(QtGui.QColor(“黑色”))
button.text=“不错”
layout.addWidget(按钮)
window.show()
sys.exit(app.exec_())
如果名称=“\uuuuu main\uuuuuuuu”:
main()

不幸的是,图标和文本绘制在同一层上,而图标是在导致您指出的问题的文本之后绘制的。考虑到上述情况,可能的解决方案是在按钮上方创建QLabel:

从PyQt5导入QtCore、QtGui、qtwidget
类HexButton(qtwidts.QPushButton):
定义初始值(自身、颜色、父项=无):
超级(六角按钮,自我)。\uuuu初始化\uuuuu(父级)
#将svg转换为图像
qimage=QtGui.qimage.fromData(self.svg_hexagon(彩色))
qicon=QtGui.QPixmap(qimage)
#将图标设置为六边形
self.setIcon(QtGui.QIcon(QIcon))
#将图标大小设置为整个内容
self.setIconSize(QtCore.QSize(48,48))
#使按钮不可见
自选表格(
"""
边框:无;“”“
)
self.text_label=qtwidts.QLabel()
self.text_label.setContentsMargins(0,0,0,0)
self.text_label.setStyleSheet(“”颜色:白色;“”)
lay=qtwidts.QVBoxLayout(self)
lay.addWidget(self.text\u标签,alignment=QtCore.Qt.AlignCenter)
def svg_六边形(自身,颜色):
svg_字节=f“”
返回bytearray(svg_字节,encoding=“utf-8”)
@财产
def文本(自我):
返回self.text_label.text()
@文本设置器
def文本(自我,t):
self.text_label.setText(t)
def main():
导入系统
app=qtwidts.QApplication(sys.argv)
window=qtwidts.QWidget()
layout=qtwidts.QHBoxLayout(窗口)
按钮=六角按钮(QtGui.QColor(“黑色”))
button.text=“不错”
layout.addWidget(按钮)
window.show()
sys.exit(app.exec_())
如果名称=“\uuuuu main\uuuuuuuu”:
main()

虽然这严格地回答了我的问题(谢谢),但我无法使用它,因为我无法设置此问题的位置。我的目标是将它们作为六边形按钮网格(用于六边形扫雷舰)。@luknuk-mmm,你的解释让我觉得你有一个,我解释了不便之处,并提供了解决办法,除此之外,不幸的是,我无法猜测,因此在这种情况下,我建议你写一个新问题,解释扫雷舰以及我当前解决方案的局限性,然后社区将帮助你。我发现这是由于我将其添加到布局中,而不是将窗口设置为父窗口。谢谢你,我不知道XY的问题。我会将你的答案标记为正确。虽然这严格地回答了我的问题(谢谢),但我无法使用它,因为我无法为此设置位置。我的目标是将它们作为六边形按钮网格(用于六边形扫雷舰)。@luknuk-mmm,你的解释让我觉得你有一个,我解释了不便之处,并提供了解决办法,除此之外,不幸的是,我无法猜测,因此在这种情况下,我建议你写一个新问题,解释扫雷舰以及我当前解决方案的局限性,然后社区将帮助你。我发现这是由于我将其添加到布局中,而不是将窗口设置为父窗口。谢谢你,我不知道XY的问题。我会认为你的答案是正确的。
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_())