如何在 PyQt 中制作双箭头按钮

Posted

技术标签:

【中文标题】如何在 PyQt 中制作双箭头按钮【英文标题】:How to make double arrow button in PyQt 【发布时间】:2019-05-23 03:41:30 【问题描述】:

我正在尝试制作这样的按钮

目前我可以使用来自setArrowType()Qt::LeftArrowQt::RightArrow 创建中间的两个按钮(一个右或一个左)。从docs 来看,似乎只有 5 种可能的类型。如果没有内置此功能,如何制作自定义双箭头按钮?

我现在有这个

from PyQt4 import QtCore, QtGui
import sys

class PanningButton(QtGui.QToolButton):
    """Custom button with click, short/long press, and auto-repeat functionality"""

    def __init__(self):
        QtGui.QToolButton.__init__(self)
        self.setArrowType(QtCore.Qt.LeftArrow)
        # Enable auto repeat on button hold
        self.setAutoRepeat(True)
        # Initial delay in ms before auto-repetition kicks in
        self.setAutoRepeatDelay(700)
        # Length of auto-repetition
        self.setAutoRepeatInterval(500)
        self.clicked.connect(self.buttonClicked)
        self._state = 0

    def buttonClicked(self):
        # Panning
        if self.isDown():
            if self._state == 0:
                self._state = 1
                self.setAutoRepeatInterval(50)
        # Mouse release
        elif self._state == 1:
            self._state = 0
            self.setAutoRepeatInterval(125)

def pressed():
    global counter
    counter += 1
    print(counter)

if __name__ == '__main__':
    app = QtGui.QApplication([])

    counter = 0
    panning_button = PanningButton()
    panning_button.clicked.connect(pressed)

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

【问题讨论】:

【参考方案1】:

有几种选择:

使用Qt图标,这种情况下可以使用QStyle的standardIcon():
from PyQt4 import QtCore, QtGui


class Widget(QtGui.QWidget):
    def __init__(self, parent=None):
        super(Widget, self).__init__(parent)
        button1 = QtGui.QToolButton()
        button1.setIcon(
            button1.style().standardIcon(QtGui.QStyle.SP_MediaSeekBackward)
        )

        button2 = QtGui.QToolButton()
        button2.setArrowType(QtCore.Qt.LeftArrow)

        button3 = QtGui.QToolButton()
        button3.setArrowType(QtCore.Qt.RightArrow)

        button4 = QtGui.QToolButton()
        button4.setIcon(
            button1.style().standardIcon(QtGui.QStyle.SP_MediaSeekForward)
        )

        lay = QtGui.QHBoxLayout(self)
        for btn in (button1, button2, button3, button4):
            lay.addWidget(btn)


if __name__ == "__main__":
    import sys

    app = QtGui.QApplication(sys.argv)
    w = Widget()
    w.show()
    sys.exit(app.exec_())

使用 QPainter 创建图标
def create_icon():
    pixmap = QtGui.QPixmap(QtCore.QSize(128, 128))
    pixmap.fill(QtCore.Qt.transparent)
    painter = QtGui.QPainter(pixmap)
    # draw icon
    painter.end()
    return QtGui.QIcon(pixmap)
使用由 Photoshop、corel draw、gimp 等图像编辑器创建的图标。

恕我直言,最简单的解决方案是最后一种情况,因为在第一种情况下,您仅限于 Qt 提供的功能,在第二种情况下,它可能会不必要地复杂,但第三种情况是最佳选择。

【讨论】:

使用选项 1 有效,但如何将图标颜色从默认黑色更改为绿色? @nathancy 正如我在回答的最后一部分中指出的那样:第一种方法的限制是您必须接受 Qt 提供的内容,在这种情况下您不能轻易更改颜色。为什么不使用图像编辑器生成的图像?,我认为它是最好和最简单的。 我也认为选项 3 是最简单的,但对于我的应用程序来说,当它被编译成可执行文件时,它不会被轻易地打包。 SP_MediaSeekForward 图标似乎足够好,但我只需要能够更改颜色 @nathancy 如果要使用 pyinstaller,则必须使用 data 属性,每个 GUI 都有图标作为图像,另一种选择是使用 .qrc,请参阅 ***.com/questions/15864762/pyqt4-how-do-i-compile -and-import- a-qrc 文件进入我的程序。正如您指出的那样,这是第一个替代方案的局限性

以上是关于如何在 PyQt 中制作双箭头按钮的主要内容,如果未能解决你的问题,请参考以下文章

PyQt4-如何制作一个按钮来删除组合框中的选定项目?

如何在 PyQt5 中制作自定义 QPushButton?

我们如何在按钮单击时在 pyqt 中打开特定于选项卡的选项卡?

PyQt:如何在 QStackedWidget 中切换小部件

如何在pyqt4中的行中添加箭头?

PyQt:悬停按钮时更改光标