微调按钮

微调按钮是一个文本字段,它接受一系列值,并带有按钮,允许将该值按固定量增加或减少。

GtkAdjustment *spin_adjustment =
  gtk_adjustment_new (0.0, 0.0, 100.0, 1.0, 5.0, 0.0);

GtkWidget *spin_button =
  gtk_spin_button_new (spin_adjustment, 1.0, 0);

微调按钮使用 GtkAdjustment 对象作为 模型来确定它们可以显示的值的范围。微调按钮的当前值将更新 GtkAdjustment:value 属性,反之亦然。

值的变化

您可以使用以下信号之一来监控微调按钮值的变化

  • GtkSpinButton::value-changed

  • GtkAdjustment::value-changed

  • GObject::notifyGtkAdjustment:value 属性上

// "adj" is defined elsewhere
GtkWidget *spin_button = gtk_spin_button_new (adj, 1.0, 0);

// "on_value_changed" is defined elsewhere
g_signal_connect (spin_button, "value-changed",
                  G_CALLBACK (on_value_changed),
                  NULL);

非数值微调按钮

调整只能在数值之间插值,但微调按钮可以显示任何类型的字母数字值,只要它可以映射到调整的范围和当前值。微调按钮可以使用 GtkSpinButton::input 信号将微调按钮的当前内容转换为数值,并使用 GtkSpinButton::output 信号将调整的数值转换为要显示的数据。

static const char *values[] = {
  "Live",
  "Laugh",
  "Love",
};

static const guint n_values = G_N_ELEMENTS (values);

static void
transform_spin_input (GtkSpinButton *self,
                      double *new_value,
                      gpointer user_data G_GNUC_UNUSED)
{
  const char *text = gtk_editable_get_text (GTK_EDITABLE (self));

  // Search for the allowed values, and map them to their
  // numerical identifier
  for (guint i = 0; i < n_values; i++)
    {
      if (g_strcmp0 (text, values[i]) == 0)
        {
          gtk_widget_remove_css_class (GTK_WIDGET (self), "error");

          *new_value = i;
          return;
        }
    }

  *new_value = 0;

  gtk_widget_add_css_class (GTK_WIDGET (self), "error");
}

static void
transform_spin_output (GtkSpinButton *self,
                       gpointer user_data G_GNUC_UNUSED)
{
  GtkAdjustment *adjustment = gtk_spin_button_get_adjustment (self);
  int value = gtk_adjustment_get_value (adjustment);

  g_assert (value >= 0 && value < n_values);

  gtk_editable_set_text (GTK_EDITABLE (self), values[value]);
}

// ...

GtkAdjustment *adj = gtk_adjustment_new (0, 0, 2, 1, 1, 0);

GtkWidget *spin_button = gtk_spin_button_new (adj, 1.0, 0);

gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spin_button), FALSE);

g_signal_connect (spin_button, "input",
                  G_CALLBACK (transform_spin_input),
                  NULL);
g_signal_connect (spin_button, "output",
                  G_CALLBACK (transform_spin_output),
                  NULL);

组件的常用方法

  • set_digits() 方法控制微调按钮值的精度;如果您只需要整数值,可以使用值 0。

API 参考

在示例中,我们使用了以下类