python中setpos_单击并拖动鼠标python/pysid时增加/减少QSpinBox值

本文介绍了如何使用Python PySide2创建一个自定义的QLineEdit子类,模仿Maya中通道盒内的滑块行为,允许用户通过点击并拖动鼠标中键来增加或减少QSpinBox的数值。示例代码展示了如何实现这个功能,包括处理鼠标事件、滚轮事件以及按下Ctrl和Shift键改变调整速率。
摘要由CSDN通过智能技术生成

我遇到了同样的问题,不幸的是,只有当您从箭头或数字调整框的边界单击并拖动时,我找到的解决方案才有效。但是大多数用户希望从实际的文本字段中拖动,所以这样做并不直观。在

相反,您可以将QLineEdit子类化以获得正确的行为。当你点击它时,它会保存它的当前值,这样当用户拖动它时,它会得到鼠标位置的增量并将其应用到数字调整框上。在

这是我用自己的一个完整的例子。但是很抱歉,它是Maya的属性样式,而不是Max的属性样式,因此您可以单击并拖动鼠标中键来设置该值。通过一些调整,你可以很容易地让它像Max一样工作:from PySide2 import QtCore

from PySide2 import QtGui

from PySide2 import QtWidgets

class CustomSpinBox(QtWidgets.QLineEdit):

"""

Tries to mimic behavior from Maya's internal slider that's found in the channel box.

"""

IntSpinBox = 0

DoubleSpinBox = 1

def __init__(self, spinbox_type, value=0, parent=None):

super(CustomSpinBox, self).__init__(parent)

self.setToolTip(

"Hold and drag middle mouse button to adjust the value\n"

"(Hold CTRL or SHIFT change rate)")

if spinbox_type == CustomSpinBox.IntSpinBox:

self.setValidator(QtGui.QIntValidator(parent=self))

else:

self.setValidator(QtGui.QDoubleValidator(parent=self))

self.spinbox_type = spinbox_type

self.min = None

self.max = None

self.steps = 1

self.value_at_press = None

self.pos_at_press = None

self.setValue(value)

def wheelEvent(self, event):

super(CustomSpinBox, self).wheelEvent(event)

steps_mult = self.getStepsMultiplier(event)

if event.delta() > 0:

self.setValue(self.value() + self.steps * steps_mult)

else:

self.setValue(self.value() - self.steps * steps_mult)

def mousePressEvent(self, event):

if event.buttons() == QtCore.Qt.MiddleButton:

self.value_at_press = self.value()

self.pos_at_press = event.pos()

self.setCursor(QtGui.QCursor(QtCore.Qt.SizeHorCursor))

else:

super(CustomSpinBox, self).mousePressEvent(event)

self.selectAll()

def mouseReleaseEvent(self, event):

if event.button() == QtCore.Qt.MiddleButton:

self.value_at_press = None

self.pos_at_press = None

self.setCursor(QtGui.QCursor(QtCore.Qt.IBeamCursor))

return

super(CustomSpinBox, self).mouseReleaseEvent(event)

def mouseMoveEvent(self, event):

if event.buttons() != QtCore.Qt.MiddleButton:

return

if self.pos_at_press is None:

return

steps_mult = self.getStepsMultiplier(event)

delta = event.pos().x() - self.pos_at_press.x()

delta /= 6 # Make movement less sensitive.

delta *= self.steps * steps_mult

value = self.value_at_press + delta

self.setValue(value)

super(CustomSpinBox, self).mouseMoveEvent(event)

def getStepsMultiplier(self, event):

steps_mult = 1

if event.modifiers() == QtCore.Qt.CTRL:

steps_mult = 10

elif event.modifiers() == QtCore.Qt.SHIFT:

steps_mult = 0.1

return steps_mult

def setMinimum(self, value):

self.min = value

def setMaximum(self, value):

self.max = value

def setSteps(self, steps):

if self.spinbox_type == CustomSpinBox.IntSpinBox:

self.steps = max(steps, 1)

else:

self.steps = steps

def value(self):

if self.spinbox_type == CustomSpinBox.IntSpinBox:

return int(self.text())

else:

return float(self.text())

def setValue(self, value):

if self.min is not None:

value = max(value, self.min)

if self.max is not None:

value = min(value, self.max)

if self.spinbox_type == CustomSpinBox.IntSpinBox:

self.setText(str(int(value)))

else:

self.setText(str(float(value)))

class MyTool(QtWidgets.QWidget):

"""

Example of how to use the spinbox.

"""

def __init__(self, parent=None):

super(MyTool, self).__init__(parent)

self.setWindowTitle("Custom spinboxes")

self.resize(300, 150)

self.int_spinbox = CustomSpinBox(CustomSpinBox.IntSpinBox, parent=self)

self.int_spinbox.setMinimum(-50)

self.int_spinbox.setMaximum(100)

self.float_spinbox = CustomSpinBox(CustomSpinBox.DoubleSpinBox, parent=self)

self.float_spinbox.setSteps(0.1)

self.main_layout = QtWidgets.QVBoxLayout()

self.main_layout.addWidget(self.int_spinbox)

self.main_layout.addWidget(self.float_spinbox)

self.setLayout(self.main_layout)

# Run the tool.

global tool_instance

tool_instance = MyTool()

tool_instance.show()

我试图使函数与Qt的本机spinBox匹配。我不需要它在我的情况下,但它将很容易添加一个信号时,值的变化释放。它也可以很容易地把它带到下一个水平,像胡迪尼的滑块,这样步进率可以改变取决于鼠标垂直的位置。呸,也许是为了下雨天:)。在

以下是当前的功能:可以同时执行整数或双数字调整框

单击并拖动鼠标中键以设置值

拖动时,按住ctrl键可提高速率,按住shift键可减慢速率

您仍然可以像正常一样键入值

也可以通过滚动鼠标滚轮来更改值(按住ctrl和shift可更改速率)

Hamm9.gif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值