【问题标题】:How to do a custom range for a QSpinBox如何为 QSpinBox 自定义范围
【发布时间】:2013-08-21 12:26:48
【问题描述】:

您好,第一次在这里发帖。我搜索并发现重新实现 QSpinBox 类如何允许自定义使用。但是,我不确定我的需求是否与我通过重新实现 validate 方法所发现的一样多。

我需要一个自定义范围,该范围不包括值范围中的零值。微调器用于选择加载图像的缩放比例。设计时的初始范围是 -25 到 10。该范围可能会根据图像的尺寸而变化。尽管如此,我必须能够“跳过”零以获得所需的缩放系数。例如,范围必须始终从 -1 到 1,反之亦然。

【问题讨论】:

  • 似乎跳过某些值的唯一方法是重新实现 stepBy 函数。
  • 看来我可以直接调用stepBy而不是通过重新实现。我将与@headsvk 的建议一起使用它
  • 我的意思是“唯一正确的方法” :) QAbstractSpinBox 提供了 stepBy 虚拟功能,正是为了实现您的目标。
  • 确实!这就是我要使用它的原因:)

标签: qt qspinbox


【解决方案1】:

我假设你正在收听QSpinbox::valueChanged(int i) 信号,你可以这样做:

void zoomImage(int i) {
   if (i == 0) {
      if (lastValue < 0)      //if sliding from negative values
         spinBox->setValue(1);
      else
         spinBox->setValue(-1);

      return;                  //skip processing for 0
   }
   else
      lastValue = i;           //save last state to a class variable

   //processing...
}

编辑:int lastValue 用于存储滑块在达到 0 之前的位置,以确定用户滑动到负值还是正值

【讨论】:

  • 感谢您的建议。您发布的示例是插槽吗?它与信号 valueChanged(int i) 具有相同的名称和签名。我正在使用该信号并从中调用一个插槽(zoomImage(int))。这可能比重新实现 QSpinBox 方法更好(或至少更简单)。需要为 lastValue 捕获/缓存一种方法
  • 是的,它是一个插槽.. 你需要以某种方式知道用户移动滑块的方向以便跳过 0 到 -1 或 1,所以我使用 lastValue 来记住最后一个位置滑块到达 0
  • 有一个我认为的解决方案,但由于我在 SO 种姓制度中的地位,暂时无法发布。
【解决方案2】:

什么似乎奏效了:

void MainWindow::zoomImage(int ctlValue)
{
   if(ctlValue == 0)
   {
     if(zoomLastValue < 0)
        ui->sbScaleImage->stepBy(1);
     else
        ui->sbScaleImage->stepBy(-1);
   }

   zoomLastValue = ui->sbScaleImage->value();
}

抱歉,如果我搞砸了格式。

【讨论】:

    猜你喜欢
    • 2015-07-07
    • 1970-01-01
    • 1970-01-01
    • 2010-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-20
    相关资源
    最近更新 更多