首页 > 解决方案 > 将水平/垂直滑块转换为单个按钮

问题描述

我正在寻找一种将水平滑块 + 垂直滑块转换为框区域中的单个按钮的方法。你知道或认为 Qt 有能力做到这一点吗?

这张图片显示了我想要的

在此处输入图像描述

标签: pythonpyqtpyqt4

解决方案


如果您使用鼠标事件,这种小部件很容易创建:

  • 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_())

推荐阅读