【问题标题】:QT: How do I raise/lower value of label depending on value of SpinBoxQT:如何根据 SpinBox 的值提高/降低标签的值
【发布时间】:2013-12-14 19:16:13
【问题描述】:

首先让我说,我是 QTCreator 的新手。我有以下所有的 UI 设置,只是无法弄清楚如何正确连接信号和插槽:

好的,这是我的问题。我有 5 个 SpinBox,最大值为 10,最小值为 0,所有这些都从 0 开始。我有一个值为 25 的标签。当我使用 +/- 按钮更改旋转框的值时,我希望标签也减去或加回 25 的标签。此外,一旦 25 的值达到0 我希望禁用所有旋转框以进行添加。

(不幸的是,由于我使用表单创建器设置了这一切,所以所有代码都是默认的。

例子:

Label: 1
SB1: 5
SB2: 10
SB3: 2
SB4: 6
SB5: 1

SpinBoxes 的所有值都等于 24。当按下加号按钮时,所有框的值都是 25。因此,我希望禁用所有 + 按钮,当按下 - 按钮时,我希望启用。

【问题讨论】:

  • 看看signals/slots机制。
  • 看.. 我这样做了,我得到,'(obj1,SIGNAL(valueChanged(int)),obj2,SLOT(setNum(int)))' 它将标签更改为确切的数字旋转框的
  • 您不能直接在设计器中执行此操作,需要一个连接到 valueChnaged() 的中间自定义插槽(在 C++ 中定义),从 spinbox 获取 int 并调用 label->setNum(value+ 1)

标签: c++ qt user-interface qlabel qspinbox


【解决方案1】:

这是假设您有一个带有标签和 5 个旋转框的表单类的代码。

标题:

class MainWindow : public QMainWindow {
  Q_OBJECT

public:
  explicit MainWindow(QWidget *parent = 0);
  ~MainWindow();

private:
  Ui::MainWindow *ui;
  double sum;
  QList<QSpinBox*> spinboxes;

private slots:
  void spinbox_value_changed();

};

来源:

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
  sum = 25;
  ui->setupUi(this);
  spinboxes << ui->spinBox_1 << ui->spinBox_2 << ui->spinBox_3
            << ui->spinBox_4 << ui->spinBox_5;
  foreach(QSpinBox* spinbox, spinboxes) {
    connect(spinbox, SIGNAL(valueChanged(int)),
            this, SLOT(spinbox_value_changed()));
    spinbox->setRange(0, sum);
  }
  spinbox_value_changed();
}

MainWindow::~MainWindow() {
  delete ui;
}

void MainWindow::spinbox_value_changed() {
  double current_sum = 0;
  foreach(QSpinBox* spinbox, spinboxes) {
    current_sum += spinbox->value();
  }
  double points_left = sum - current_sum;
  if (points_left < 0) {
    foreach(QSpinBox* spinbox, spinboxes) {
      spinbox->setValue(0);
    }
    return;
  }
  foreach(QSpinBox* spinbox, spinboxes) {
    if (points_left == 0) {
      spinbox->setMaximum(spinbox->value());
    } else {
      spinbox->setMaximum(sum);
    }
  }
  ui->label->setText(QString().setNum(points_left));
}

我希望代码是不言自明的。 Spinboxes 不会在我的系统上禁用它们的按钮(尽管在使用其他样式时它们可能会禁用),但是当达到最大总和时,加号按钮会停止工作。

【讨论】:

  • 还有 很多 示例与 qtcreator 捆绑在一起。
  • @Pavel_Strakhov 这行​​得通!我非常感谢你!我不认为我会想到这种方法......它表明我在编程方面还有很多东西要学习。再次感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-07
  • 1970-01-01
  • 2019-06-22
  • 2011-01-15
  • 2022-01-16
  • 1970-01-01
  • 2013-02-26
相关资源
最近更新 更多