微调框QSpinBox

作用:允许用户按照一定的步长,来增加或减少其中显示的数值

有两种类型的微调框

  • QSpinBox - 用于整数的显示和输入
  • QDoubleSpinBox - 用于浮点数的显示和输入

包括最大值、最小值、当前值

// 获取和设置当前值
int value() const
void setValue(int val)

// 获取和设置最大值
int maximum() const
void setMaximum(int max)

// 获取和设置最小值
int minimum() const
void setMinimum(int min)

// 一次设置最大值和最小值
void setRange(int minimum, int maximum)

步长

即点击上下调整按钮时的单步改变值,就是点击一次,增加或减少的值

// 获取和设置步长
 int singleStep() const
 void setSingleStep(int val)

循环

数值达到最大值时,继续点击增加,值会回到最小

数值达到最小值时,点击减少,值会回到最大

// 获取和设置是否允许循环
bool wrapping() const
void setWrapping(bool w)

加速

即长按增加/减少按钮时,数值会快速的的增加/减少

// 获取和设置是否允许加速
bool isAccelerated() const
void setAccelerated(bool on)

前缀/后缀

可以设置微调框中显示前缀或者后缀

比如微调框中表示重量,则可以加一个KG的后缀

// 获取和设置前缀
QString prefix() const
void setPrefix(const QString &prefix)
 
// 获取和设置后缀
QString suffix() const
void setSuffix(const QString &suffix)

常用信号

//数值改变时发射
void valueChanged(int i)

举例

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include<QLabel>
#include<QSpinBox>
#include<QGridLayout>
#include<QMessageBox>

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr):QWidget(parent)
    {
        resize(300,300);
        QGridLayout* grid=new QGridLayout(this);

        QLabel* lbl1=new QLabel("身高:",this);
        lbl1->setFixedSize(50,50);

        height=new QSpinBox(this);
        height->setRange(150,195);//设置范围
        height->setWrapping(true);//设置可以循环
        height->setSuffix("cm");//设置后缀
        height->setAccelerated(true);//设置加速
        height->setSingleStep(1);//设置步长
        grid->addWidget(lbl1,0,0);
        grid->addWidget(height,0,1);

        QLabel* lbl2=new QLabel("体重:",this);
        lbl2->setFixedSize(50,50);

        weight=new QSpinBox(this);
        weight->setRange(45,100);//设置范围
        weight->setWrapping(true);//设置可以循环
        weight->setSuffix("kg");//设置后缀
        weight->setAccelerated(true);//设置加速
        weight->setSingleStep(1);//设置步长
        grid->addWidget(lbl2,1,0);
        grid->addWidget(weight,1,1);

        //绑定槽函数
        connect(height,&QSpinBox::valueChanged,this,&Widget::onValueChange);
        connect(weight,&QSpinBox::valueChanged,this,&Widget::onValueChange);

    }
    ~Widget()=default;
private:
    void onValueChange()
    {
        QString str_text="身高"+QString::number(height->value())
                           +"cm,体重"+QString::number(weight->value())+"kg";
        QMessageBox::information(this,"",str_text);
    }

    QSpinBox* height;
    QSpinBox* weight;
};
#endif // WIDGET_H

学习链接:https://github.com/0voice

<think> 我们正在讨论的是QSpinBox,它是一个用于处理整数的微调框控件。根据引用资料,我们可以总结以下要点: 1. QSpinBox是QAbstractSpinBox的直接子类,专门处理整数和离散值集合(引用[1])。 2. 对于浮点数,应使用QDoubleSpinBox(引用[1][4])。 3. QSpinBox具有一些属性,如最大值(maximum)、最小值(minimum)、步长(singleStep)、前缀(prefix)、后缀(suffix)等(引用[1][5])。 4. 它提供了信号valueChanged(int)来响应数值变化(引用[5])。 现在,我将详细介绍QSpinBox处理整数的使用方法和特性。 ### 一、基本使用方法 #### 1. 创建和设置范围 ```python from PyQt6.QtWidgets import QApplication, QWidget, QSpinBox, QVBoxLayout app = QApplication([]) window = QWidget() layout = QVBoxLayout() # 创建QSpinBox spin_box = QSpinBox() spin_box.setRange(0, 100) # 设置范围0-100 layout.addWidget(spin_box) window.setLayout(layout) window.show() app.exec() ``` #### 2. 设置步长 ```python spin_box.setSingleStep(5) # 每次增加/减少5 ``` #### 3. 设置前后缀 ```python spin_box.setPrefix("$") # 显示为"$10" spin_box.setSuffix(" kg") # 显示为"10 kg" ``` #### 4. 获取和设置当前值 ```python current_value = spin_box.value() spin_box.setValue(50) ``` ### 二、核心特性详解 #### 1. 数值范围控制 - `setMinimum(int min)` 和 `setMaximum(int max)` 分别设置最小值和最大值 - `minimum()` 和 `maximum()` 获取当前范围边界 #### 2. 步长控制 - `setSingleStep(int step)` 设置步长(默认为1) - 用户可通过键盘上下键、鼠标滚轮或按钮以步长单位调整数值 #### 3. 显示格式控制 - **前缀/后缀**:通过`setPrefix()`和`setSuffix()`添加单位符号 ```python spin_box.setPrefix("温度: ") spin_box.setSuffix(" ℃") ``` - **进制显示**:使用`setDisplayIntegerBase(base)`可设置为二进制/八进制等 ```python spin_box.setDisplayIntegerBase(2) # 二进制显示 ``` #### 4. 特殊值处理 - 可通过`setSpecialValueText()`设置当值为最小值时显示的文本 ```python spin_box.setMinimum(0) spin_box.setSpecialValueText("OFF") # 当值为0时显示"OFF" ``` ### 三、信号机制 当数值改变时发射信号: ```python spin_box.valueChanged.connect(lambda value: print(f"新值: {value}")) ``` - 信号类型:`valueChanged(int)` - 注意:通过程序调用`setValue()`也会触发此信号 ### 四、扩展功能示例 #### 自定义验证 ```python from PyQt6.QtGui import QIntValidator # 创建验证器限制只能输入偶数 class EvenValidator(QIntValidator): def validate(self, input_str, pos): result, num, _ = super().validate(input_str, pos) if result == QIntValidator.State.Acceptable: if num % 2 != 0: return (QIntValidator.State.Invalid, input_str, pos) return (result, num, pos) validator = EvenValidator(0, 100, spin_box) spin_box.setValidator(validator) ``` #### 动态范围调整 ```python # 根据当前值动态调整范围上限 def adjust_maximum(value): if value > 50: spin_box.setMaximum(200) spin_box.valueChanged.connect(adjust_maximum) ``` ### 五、注意事项 1. **数值溢出**:当设置值超出范围时自动修正为边界值 2. **前缀/后缀交互**: - 用户输入时前缀/后缀不会显示在编辑框中 - 通过`cleanText()`获取无前缀/后缀的纯数值字符串 ```python print(spin_box.cleanText()) # 输出"10"而非"$10" ``` §§相关问题§§ 1. 如何在PyQt6中实现QSpinBox的自定义数值验证? 2. QSpinBox与QSlider控件如何实现双向数据绑定? 3. 如何防止QSpinBox值改变信号导致的事件循环阻塞? 4. 在PyQt6中使用QSpinBox时如何支持十六进制显示和输入? </think> ### QSpinBox 处理整数的使用方法和特性详解 QSpinBox 是 PyQt6 中专门用于处理整数输入和显示的微调框控件,以下是其主要特性和使用方法: #### 一、核心功能特性 1. **整数专用处理**: - 专门用于处理整数输入,不支持浮点数(需使用 QDoubleSpinBox)[^1][^4] - 默认范围 $0 \sim 99$,可通过编程扩展范围 - 支持步进值设置(每次增减的量) $$ \text{当前值} \pm \text{步进值} = \text{新值} $$ 2. **显示格式控制**: ```python # 设置前后缀 spin_box.setPrefix("$") # 显示为 "$10" spin_box.setSuffix(" kg") # 显示为 "10 kg" ``` - `cleanText()` 方法获取纯数值(不含前后缀)[^1][^5] - `displayIntegerBase` 属性支持不同进制显示(二进制、八进制、十六进制)[^1] 3. **范围约束与控制**: ```python spin_box.setMinimum(0) # 最小值 spin_box.setMaximum(100) # 最大值 spin_box.setSingleStep(5) # 步进值 ``` #### 二、基础使用方法 ```python from PyQt6.QtWidgets import QApplication, QSpinBox, QVBoxLayout, QWidget class SpinBoxDemo(QWidget): def __init__(self): super().__init__() layout = QVBoxLayout() # 创建整数微调框 self.spin_box = QSpinBox() self.spin_box.setRange(-50, 50) # 值域范围 self.spin_box.setSingleStep(2) # 步进值 self.spin_box.setPrefix("温度: ") # 前缀 self.spin_box.setSuffix(" ℃") # 后缀 # 连接值改变信号 self.spin_box.valueChanged.connect(self.on_value_changed) layout.addWidget(self.spin_box) self.setLayout(layout) def on_value_changed(self, value): print(f"当前值: {value}, 纯数值: {self.spin_box.cleanText()}") ``` #### 三、进阶应用场景 1. **动态范围约束**: ```python # 根据其他控件动态调整范围 def update_range(max_val): self.spin_box.setMaximum(max_val) # 外部调用:update_range(200) ``` 2. **自定义验证逻辑**: ```python class EvenValidator(QValidator): def validate(self, input_str, pos): # 只允许偶数输入 if input_str.isdigit() and int(input_str) % 2 == 0: return (QValidator.State.Acceptable, input_str, pos) return (QValidator.State.Invalid, input_str, pos) self.spin_box.setValidator(EvenValidator(self)) ``` 3. **进制显示支持**: ```python self.spin_box.setDisplayIntegerBase(16) # 十六进制显示 self.spin_box.setPrefix("0x") ``` #### 四、信号与交互 1. **核心信号**: ```python # 值改变信号(带整数值参数) spin_box.valueChanged.connect(lambda val: print(f"新值: {val}")) # 文本改变信号(带字符串参数) spin_box.textChanged.connect(lambda text: print(f"显示文本: {text}")) ``` 2. **编程控制**: ```python spin_box.setValue(25) # 设置值 spin_box.stepUp() # 增加一个步进值 spin_box.stepDown() # 减少一个步进值 print(spin_box.cleanText()) # 获取无前缀后缀的文本 ``` #### 五、性能注意事项 1. **避免频繁更新**: - 在批量操作时禁用信号 ```python spin_box.blockSignals(True) # 开始批量更新 # 执行多次值更新... spin_box.blockSignals(False) # 结束更新并发射信号 ``` 2. **大范围优化**: - 当范围超大时(如 $0 \sim 10^6$),使用 `setRange()` 而非逐个设置 - 避免在 `valueChanged` 信号中执行耗时操作
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值