python - 将水平/垂直滑块转换为单个按钮
解决方案
如果您使用鼠标事件,这种小部件很容易创建:
- mousePressEvent:如果鼠标在光标上方,光标可以移动
- mouseReleaseEvent:禁用光标
- mouseMoveEvent:如果启用了移动,则移动光标
然后,使用 将paintEvent
光标显示在其位置。
要定义光标的值,您必须将像素位置转换为基于轴边界的值。
一个 H 值介于 -10 和 20 之间且 V 值介于 -10 和 10 之间的操纵杆的简单示例:
from PyQt4.QtGui import QWidget, QApplication, QPainter
from PyQt4 import QtCore
import sys
class Joystick(QWidget):
def __init__(self, parent=None):
super(Joystick, self).__init__(parent)
self.setFixedSize(100, 100)
self._minimumX = -10
self._maximumX = 20
self._minimumY = -10
self._maximumY = 10
self.cursorPosition = QtCore.QPointF(10, 90)
self.grabCursor = False
def valueX(self):
return (self.cursorPosition.x() - 10) * (self._maximumX - self._minimumX) / (self.width() - 20) + self._minimumX
def valueY(self):
return (self.cursorPosition.y() - 10) * (self._maximumY - self._minimumY) / (self.width() - 20) + self._minimumY
def paintEvent(self, event):
painter = QPainter(self)
painter.setBrush(QtCore.Qt.lightGray)
painter.setPen(QtCore.Qt.NoPen)
painter.drawRect(0, 0, self.width(), self.height())
painter.setBrush(QtCore.Qt.blue)
painter.drawEllipse(self.cursorRect())
def boundedCursor(self, position):
def bound(low, high, value):
return max(low, min(high, value))
x = bound(10, self.width() - 10, position.x())
y = bound(10, self.height() - 10, position.y())
return QtCore.QPointF(x, y)
def cursorRect(self):
return QtCore.QRectF(-5, -5, 10, 10).translated(self.cursorPosition)
def mousePressEvent(self, ev):
self.grabCursor = self.cursorRect().contains(ev.pos())
return super().mousePressEvent(ev)
def mouseReleaseEvent(self, event):
self.grabCursor = False
self.update()
def mouseMoveEvent(self, event):
if self.grabCursor:
print("Moving")
self.cursorPosition = self.boundedCursor(event.pos())
self.update()
print(self.valueX(), self.valueY())
if __name__ == '__main__':
# Create main application window
app = QApplication([])
joystick = Joystick()
joystick.show()
sys.exit(app.exec_())
推荐阅读
- javascript - 如何在控制台日志中检索数据长度
- python - 创建一个大小为 n 且具有初始化值的数组
- xamarin - 如何在 Xamarin.Forms 中实现 Paypal 结帐选项?
- database - ArangoDB:如何选择正确的索引
- android - 安装应用程序后如何将 .so 文件复制到 jniLibs 文件夹
- python - potrait 图像在 django 中显示不正确
- angular - 角度测试:模拟基类
- python - Conda 环境继续使用 python 2.7 而不是 python 3.6
- javascript - 我想用 IDBKeyRange.only() 判断 Date 是否相等
- c++ - C++ 中的链接器接受具有相同参数和不同返回类型的函数,但我得到 SEGFAULT