#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 должно произойти после активации. В вашем решении это было при сигнальном соединении.