首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >center按钮图标左对齐文本居中对齐

center按钮图标左对齐文本居中对齐
EN

Stack Overflow用户
提问于 2019-05-14 19:30:31
回答 1查看 912关注 0票数 3

我无法正确对齐图标和按钮文本。

我已经用Designer生成了应用程序gui,默认情况下它们看起来像这样:

我添加了一些代码,

代码语言:javascript
复制
win.pb_ejecutar.setStyleSheet("QPushButton { text-align: left; }")

我得到了这个

但我需要的是这个,图标左对齐和文本居中对齐

我通过在名称中添加空格来做到这一点,但我发现它不是很优雅

有人来帮我吗??谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-16 06:18:01

图标和文本之间的对齐方式是相同的,因此Qt样式表没有解决方案,因此另一种选择是使用QProxyStyle:

代码语言:javascript
复制
import sys
from PyQt5 import QtCore, QtGui, QtWidgets


class ProxyStyle(QtWidgets.QProxyStyle):
    def drawControl(self, element, option, painter, widget=None):
        if element == QtWidgets.QStyle.CE_PushButtonLabel:
            icon = QtGui.QIcon(option.icon)
            option.icon = QtGui.QIcon()
        super(ProxyStyle, self).drawControl(element, option, painter, widget)
        if element == QtWidgets.QStyle.CE_PushButtonLabel:
            if not icon.isNull():
                iconSpacing = 4
                mode = (
                    QtGui.QIcon.Normal
                    if option.state & QtWidgets.QStyle.State_Enabled
                    else QtGui.QIcon.Disabled
                )
                if (
                    mode == QtGui.QIcon.Normal
                    and option.state & QtWidgets.QStyle.State_HasFocus
                ):
                    mode = QtGui.QIcon.Active
                state = QtGui.QIcon.Off
                if option.state & QtWidgets.QStyle.State_On:
                    state = QtGui.QIcon.On
                window = widget.window().windowHandle() if widget is not None else None
                pixmap = icon.pixmap(window, option.iconSize, mode, state)
                pixmapWidth = pixmap.width() / pixmap.devicePixelRatio()
                pixmapHeight = pixmap.height() / pixmap.devicePixelRatio()
                iconRect = QtCore.QRect(
                    QtCore.QPoint(), QtCore.QSize(pixmapWidth, pixmapHeight)
                )
                iconRect.moveCenter(option.rect.center())
                iconRect.moveLeft(option.rect.left() + iconSpacing)
                iconRect = self.visualRect(option.direction, option.rect, iconRect)
                iconRect.translate(
                    self.proxy().pixelMetric(
                        QtWidgets.QStyle.PM_ButtonShiftHorizontal, option, widget
                    ),
                    self.proxy().pixelMetric(
                        QtWidgets.QStyle.PM_ButtonShiftVertical, option, widget
                    ),
                )
                painter.drawPixmap(iconRect, pixmap)


if __name__ == "__main__":

    app = QtWidgets.QApplication(sys.argv)
    app.setStyle('fusion')
    proxy_style = ProxyStyle(app.style())
    app.setStyle(proxy_style)

    w = QtWidgets.QWidget()
    lay = QtWidgets.QVBoxLayout(w)
    icons = [
        app.style().standardIcon(standardIcon)
        for standardIcon in (
            QtWidgets.QStyle.SP_MediaPlay,
            QtWidgets.QStyle.SP_MediaPause,
            QtWidgets.QStyle.SP_MediaSeekBackward,
            QtWidgets.QStyle.SP_MediaSeekForward,
        )
    ]
    for text, icon in zip("Play Pause Backward Forward".split(), (icons)):
        button = QtWidgets.QPushButton(text)
        button.setIcon(icon)
        lay.addWidget(button)
    w.show()
    sys.exit(app.exec_())

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56129402

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档