У меня странная проблема с записями Gtkmm в C ++.
Я определил здесь Gtk :: Entry с именем inputEntry. У меня есть функция под названием CSF.
Где я объявляю запись в основном:
// 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(&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, всегда показывают print начальное значение и только начальное значение Gtk :: Entry. Что случилось?
Примечание: я делал это раньше в Python, примерно так же, и это работало. Я хочу попробовать сделать это на C ++. Может быть, это потому, что я что-то не реализовал?
Это вопрос C ++, а не GTK.
В соответствии:
inputEntry.signal_activate().connect(sigc::bind<float>(sigc::ptr_fun(&csf), atof(inputEntry.get_text().c_str())));
Вы вызываете функцию csf
с двойным, созданным из строки «3.55». Чтобы получить то, что вы хотите:
inputEntry.signal_activate().connect(sigc::bind<Gtk::Entry*>(sigc::ptr_fun(&csf), &inputEntry));
(…)
void csf(Gtk::Entry* entry)
{
std::cout<<atof(entry.get_text().c_str())<<" "<<std::endl;
}
Изменение текста записи на двойное должно произойти после активации. В вашем решении это было при сигнальном подключении.
Других решений пока нет …