如何在 PyQt 中制作双箭头按钮
Posted
技术标签:
【中文标题】如何在 PyQt 中制作双箭头按钮【英文标题】:How to make double arrow button in PyQt 【发布时间】:2019-05-23 03:41:30 【问题描述】:我正在尝试制作这样的按钮
目前我可以使用来自setArrowType()
的Qt::LeftArrow
或Qt::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 中制作双箭头按钮的主要内容,如果未能解决你的问题,请参考以下文章
我们如何在按钮单击时在 pyqt 中打开特定于选项卡的选项卡?