这张图片很好地展示了我要模仿的东西
目标是创建项目或小部件,如上面的示例所示,用户可以通过MouseDoubleClicked事件在QSlider上创建这些项目或小部件,这些项目或小部件将保持在最初创建的勾号位置(它将保持不动)。 我已经尝试过使用QLabels和Pixmaps或者QGraphicsSitems和QGraphicsView的组合,但都没有成功
尽管如此,我还是觉得我很可能把事情复杂化了,而且可能有一种更简单的方法来实现这一点
你将如何制作这些“标记”
编辑:我已经尽力编辑了我以前的一次尝试,以使其成为一个最小的可复制示例。虽然可能还是太长了,但还是这样
import random
from PySide2 import QtCore, QtGui, QtWidgets
class Marker(QtWidgets.QLabel):
def __init__(self, parent=None):
super(Marker, self).__init__(parent)
self._slider = None
self.setAcceptDrops(True)
pix = QtGui.QPixmap(30, 30)
pix.fill(QtGui.QColor("transparent"))
paint = QtGui.QPainter(pix)
slider_color = QtGui.QColor(random.randint(130, 180), random.randint(130, 180), random.randint(130, 180))
handle_pen = QtGui.QPen(QtGui.QColor(slider_color.darker(200)))
handle_pen.setWidth(3)
paint.setPen(handle_pen)
paint.setBrush(QtGui.QBrush(slider_color, QtCore.Qt.SolidPattern))
points = QtGui.QPolygon([
QtCore.QPoint(5, 5),
QtCore.QPoint(5, 19),
QtCore.QPoint(13, 27),
QtCore.QPoint(21, 19),
QtCore.QPoint(21, 5),
])
paint.drawPolygon(points)
del paint
self.setPixmap(pix)
class myTimeline(QtWidgets.QWidget):
def __init__(self, parent=None):
super(myTimeline, self).__init__(parent)
layout = QtWidgets.QGridLayout(self)
self.slider = QtWidgets.QSlider(QtCore.Qt.Horizontal)
self.slider.setMinimum(0)
self.slider.setMaximum(50)
self.slider.setTickPosition(QtWidgets.QSlider.TicksAbove)
self.slider.setTickInterval(1)
self.slider.setSingleStep(1)
self.slider.setAcceptDrops(True)
self.resize(self.width(), 50)
layout.addWidget(self.slider)
def create_marker(self):
bookmark = Marker(self)
opt = QtWidgets.QStyleOptionSlider()
self.slider.initStyleOption(opt)
rect = self.slider.style().subControlRect(
QtWidgets.QStyle.CC_Slider,
opt,
QtWidgets.QStyle.SC_SliderHandle,
self.slider
)
bookmark.move(rect.center().x(), 0)
bookmark.show()
def mouseDoubleClickEvent(self, event):
self.create_marker()
你的方法确实是正确的,它只有几个问题:
应更新标记的几何图形以反映其内容。这是必需的,因为QLabel是一种非常特殊的小部件类型,通常仅在添加到布局或是顶级窗口时才调整其大小
标记pixmap未正确对齐(它略位于其中心的左侧)
标记定位不仅应使用
rect
中心,还应使用标记宽度和滑块位置(因为您要将滑块添加到父级,并且存在布局,因此滑块实际上根据布局内容边距的大小关闭)每次调整小部件的大小时,标记都应该重新定位,因此它们应该保留对其值的引用
标记对于鼠标事件应该是透明的,否则它们会阻止滑块上的鼠标控制
鉴于上述情况,我建议您:
相关问题 更多 >
编程相关推荐