带刻度标签的 Python PyQt4 滑块

2023-12-11

我是 PyQt4 的新手,我正在使用 QSlider 制作 gui。

默认情况下,滑块不会显示刻度值。我搜索过,但没有找到简单的方法来做到这一点,那么是否可以或者我必须手动进行?


我已经制定了一个解决方案,用于在垂直或水平方向向滑块添加标签。

结果截图:

enter image description here

此处代码(请注意,PyQt4 和 5 之间存在一些导入更改)。

import sys
from PyQt5 import QtWidgets
from PyQt5.QtGui import QPainter
from PyQt5.QtWidgets import QStyle, QStyleOptionSlider
from PyQt5.QtCore import QRect, QPoint, Qt


class LabeledSlider(QtWidgets.QWidget):
    def __init__(self, minimum, maximum, interval=1, orientation=Qt.Horizontal,
            labels=None, parent=None):
        super(LabeledSlider, self).__init__(parent=parent)

        levels=range(minimum, maximum+interval, interval)
        if labels is not None:
            if not isinstance(labels, (tuple, list)):
                raise Exception("<labels> is a list or tuple.")
            if len(labels) != len(levels):
                raise Exception("Size of <labels> doesn't match levels.")
            self.levels=list(zip(levels,labels))
        else:
            self.levels=list(zip(levels,map(str,levels)))

        if orientation==Qt.Horizontal:
            self.layout=QtWidgets.QVBoxLayout(self)
        elif orientation==Qt.Vertical:
            self.layout=QtWidgets.QHBoxLayout(self)
        else:
            raise Exception("<orientation> wrong.")

        # gives some space to print labels
        self.left_margin=10
        self.top_margin=10
        self.right_margin=10
        self.bottom_margin=10

        self.layout.setContentsMargins(self.left_margin,self.top_margin,
                self.right_margin,self.bottom_margin)

        self.sl=QtWidgets.QSlider(orientation, self)
        self.sl.setMinimum(minimum)
        self.sl.setMaximum(maximum)
        self.sl.setValue(minimum)
        if orientation==Qt.Horizontal:
            self.sl.setTickPosition(QtWidgets.QSlider.TicksBelow)
            self.sl.setMinimumWidth(300) # just to make it easier to read
        else:
            self.sl.setTickPosition(QtWidgets.QSlider.TicksLeft)
            self.sl.setMinimumHeight(300) # just to make it easier to read
        self.sl.setTickInterval(interval)
        self.sl.setSingleStep(1)

        self.layout.addWidget(self.sl)

    def paintEvent(self, e):

        super(LabeledSlider,self).paintEvent(e)

        style=self.sl.style()
        painter=QPainter(self)
        st_slider=QStyleOptionSlider()
        st_slider.initFrom(self.sl)
        st_slider.orientation=self.sl.orientation()

        length=style.pixelMetric(QStyle.PM_SliderLength, st_slider, self.sl)
        available=style.pixelMetric(QStyle.PM_SliderSpaceAvailable, st_slider, self.sl)

        for v, v_str in self.levels:

            # get the size of the label
            rect=painter.drawText(QRect(), Qt.TextDontPrint, v_str)

            if self.sl.orientation()==Qt.Horizontal:
                # I assume the offset is half the length of slider, therefore
                # + length//2
                x_loc=QStyle.sliderPositionFromValue(self.sl.minimum(),
                        self.sl.maximum(), v, available)+length//2

                # left bound of the text = center - half of text width + L_margin
                left=x_loc-rect.width()//2+self.left_margin
                bottom=self.rect().bottom()

                # enlarge margins if clipping
                if v==self.sl.minimum():
                    if left<=0:
                        self.left_margin=rect.width()//2-x_loc
                    if self.bottom_margin<=rect.height():
                        self.bottom_margin=rect.height()

                    self.layout.setContentsMargins(self.left_margin,
                            self.top_margin, self.right_margin,
                            self.bottom_margin)

                if v==self.sl.maximum() and rect.width()//2>=self.right_margin:
                    self.right_margin=rect.width()//2
                    self.layout.setContentsMargins(self.left_margin,
                            self.top_margin, self.right_margin,
                            self.bottom_margin)

            else:
                y_loc=QStyle.sliderPositionFromValue(self.sl.minimum(),
                        self.sl.maximum(), v, available, upsideDown=True)

                bottom=y_loc+length//2+rect.height()//2+self.top_margin-3
                # there is a 3 px offset that I can't attribute to any metric

                left=self.left_margin-rect.width()
                if left<=0:
                    self.left_margin=rect.width()+2
                    self.layout.setContentsMargins(self.left_margin,
                            self.top_margin, self.right_margin,
                            self.bottom_margin)

            pos=QPoint(left, bottom)
            painter.drawText(pos, v_str)

        return


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    frame=QtWidgets.QWidget()
    ha=QtWidgets.QHBoxLayout()
    frame.setLayout(ha)

    w = LabeledSlider(1, 10 , 1, orientation=Qt.Horizontal)

    ha.addWidget(w)
    frame.show()
    sys.exit(app.exec_())
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

带刻度标签的 Python PyQt4 滑块 的相关文章

随机推荐

  • 导入错误:无法导入名称 chardet

    嗨 我写了一个Pythonscraper我在其中导入 requests 和 Beautiful soup 模块 我正在使用 python2 7 我正在使用 py2exe 模块从我的 Python 脚本创建 Windows 可执行文件 exe
  • 允许在 Django Admin 中编辑 editable=False 字段

    DRF 将使用editable False在字段上将序列化器默认为只读 这是我利用的一个非常有用 安全的默认值 即我不会忘记将序列化器设置为只读 话虽这么说 一旦我设定了editable False有什么方法可以强制 Django 管理员允
  • 字符串加号运算符的线程安全性,包括优化

    这个帖子说a b相当于 a new StringBuilder append a append b toString 假设我有这个代码 public class MultiThreadingClass extends SomeThirdPa
  • 将 JSON 数据放入列表中

    我的 JSON 数据正确地来自我的服务器 我只想将其放入以下数组中 但我不确定 JSON 数据是否正确插入到 ArrayList 中 这是数组 private List
  • UWP 拉伸 GridView

    如何水平拉伸GridViewItem 尝试设置属性HorizontalContentAlignment或样式属性ItemContainerStyle 这没有帮助 这是一个代码
  • 使用 slf4j 读取 .properties 文件

    我想使用 slf4j 从 properties 文件中读取数据 我能够在控制台上输出数据 但我想要的是在某个文件上输出数据 所以我需要在 properties 文件中声明的文件 Appender 并且我我无法使用 slf4j 读取 prop
  • 证书如何避免中间人攻击?

    我还有一个关于网络安全的问题 如果我理解正确的话 证书是为了识别你的真实身份 所以中间人的攻击是不可能的 但当我看到这张图片时 http upload wikimedia org wikipedia commons thumb 2 2b D
  • 获取等于 php 十六进制字符串的 C# 字节数组

    所以我现在不允许修改这段php代码 主要是因为它很旧并且工作正常 Warning 总体来说代码非常糟糕 IV 没有被随机化 也没有与输出一起存储 我问这个不是因为我想 我问是因为我需要 当我开始工作时 我还计划进行重构 并使用真正可靠的加密
  • 具有 AUTO_INCRMENT 主 ID 的 MySQL 表在回滚后不会释放该数字

    我有一张桌子 上面有账单 每张账单都有一个 ID 该 ID 在我插入新记录后来自数据库 该字段是一个设置了 AUTO INCRMENT 的 INTEGER 如果我插入一条新记录作为事务的一部分并且必须回滚该事务 则 ID 将被占用并消失 因
  • 中带有 List 的动态列

    我正在尝试生成一个dataTable动态地使用列 所以我有一个List
  • Xamarin Forms 滑动按钮

    我希望在我的应用程序中添加一个滑动功能 该功能与 旧 iPhone 上的解锁机制几乎相同 参见图片 我正在努力解决如何在跨平台解决方案上实现这一点 我的直接想法是使用滑块和自定义渲染器 但不确定如果用户在完成幻灯片之前放手 如何创建捕捉以启
  • 在 AVPlayer 框架中播放 3gp 视频的已知问题?

    AVPlayer 无法在设备上播放 3gp 文件是否存在任何已知问题 mp4 文件可以正常播放 但无法从设备上的 URL 播放 3gp 文件 Thanks 如果重要的话 我使用的是 iOS 9 Swift 3 AVPlayer 或 AVPl
  • 使用手动 where 语句具有多个更新条件的 Codeigniter 模型

    我在模型中有返回数据的代码 this gt db gt select title content date where name Joe AND status boss this gt db gt where where query thi
  • SQL Server - 如何选择每个用户的最新记录?

    我正在尝试执行一个 SQL 命令 该命令应该绘制进入数据库的最后一行 基本上 当用户提交最后一个帖子 就像在这个论坛中 时 它会将用户重定向到一个页面 其中包含他的帖子标题 帖子段落以及用户名和帖子提交时间等数据 我开始研究声明 SELEC
  • PHP使用相同的变量后通过引用传递错误

    看一下这段代码 帮助我理解结果 x array hello beautiful world y array bye bye world harsh foreach x as n gt v v DONT CHANGE foreach y as
  • MS SQL Server:以小时和分钟的精度计算年龄

    我需要一个 SQL 函数来计算年龄 它必须准确并涵盖所有极端情况 由于是婴儿病房 所以30分钟是很常见的情况 我查看了其他答案 但找不到处理所有情况的答案 例如 宝宝出生于2014 04 29 12 59 00 000 现在是 2014 0
  • shell 脚本查找每个文件的文件名和行数,现在将此记录插入到 Oracle 表中

    我必须找到文件夹中可用的文件名以及每个文件行数 然后 我将获得两列数据 现在我必须将此记录插入到具有两列 col1 col2 的oracle表中 我可以写一个 shell 脚本来完成这两个任务吗 我发现自己正在写第一部分 IE wc l e
  • 我可以在 Django 中使用 XSLT 吗?

    我们使用 Django 来编写我们的新项目 我们的设计师想要使用 XSLT 编写模板 如您所知 Django 有自己的模板系统 并且我没有任何理由说明为什么设计者不能使用 XSLT 2个问题 我可以在视图中返回 XML 吗 这样做有理由吗
  • 如何正确设置d3.brush范围?

    我正在根据 Mike Bostocks 示例编写 d3 小部件http bl ocks org mbostock 1667367因此 我尝试使用预定义日期设置画笔范围 但范围矩形不适用于这些日期 var brush d3 svg brush
  • 带刻度标签的 Python PyQt4 滑块

    我是 PyQt4 的新手 我正在使用 QSlider 制作 gui 默认情况下 滑块不会显示刻度值 我搜索过 但没有找到简单的方法来做到这一点 那么是否可以或者我必须手动进行 我已经制定了一个解决方案 用于在垂直或水平方向向滑块添加标签 结