Запись get_text в Gtkmm 3.0 всегда возвращает один и тот же начальный текст

#c #gtk #gtk3 #gtkmm #gtk2

#c #gtk #gtk3 #gtkmm #gtk2

Вопрос:

У меня странная проблема с записями Gtkmm в C .
Я определил Gtk::Entry здесь, называемый inputEntry . У меня есть функция с именем csf.

Где я объявляю запись в main:

 // Create input entry
Gtk::Entry inputEntry;
inputEntry.set_editable(TRUE);
inputEntry.set_text("3.55");
inputEntry.signal_activate().connect(sigc::bind<float>(sigc::ptr_fun(amp;csf), atof(inputEntry.get_text().c_str())));
  

Позже я прикрепляю эту запись к сетке, затем добавляю эту сетку в главное окно, затем показываю все виджеты в сетке, а затем саму сетку.

Где я объявляю CSF (в начале кода есть прототип):

 void csf(float sa)
{
    printf("%f n", sa);
}
  

Однако, как ни странно, когда я запускаю программу, независимо от того, что я ввожу в Gtk::Entry, терминал всегда показывает 3.55 при отправке. Я попытался изменить set_text на «1.11», и при отправке он всегда показывал 1.11. Я даже пытался ввести второй set_text в «1.11», и он всегда показывал 1.11, затем я пробовал вообще без set_text, и он всегда показывал 0. Значение записи, независимо от того, что я ввожу, будь то 300000 или 0.1, всегда показывает начальное значение и только начальное значение Gtk::Entry . Что не так?

Примечание: я делал это в Python раньше, почти таким же образом, и это сработало. Я хочу попробовать сделать это на C . Может быть, это потому, что я что-то не реализовал?

Ответ №1:

Это вопрос C , а не gtk.

В строке:

 inputEntry.signal_activate().connect(sigc::bind<float>(sigc::ptr_fun(amp;csf), atof(inputEntry.get_text().c_str())));
  

Вы вызываете функцию csf с двойным значением, созданным из строки «3.55». Для того, чтобы получить то, что вы хотите:

 inputEntry.signal_activate().connect(sigc::bind<Gtk::Entry*>(sigc::ptr_fun(amp;csf), amp;inputEntry));
  

(…)

 void csf(Gtk::Entry* entry)
{
  std::cout<<atof(entry.get_text().c_str())<<" "<<std::endl;
}
  

Изменение текста записи на double должно произойти после активации. В вашем решении это было при сигнальном соединении.