LINUX.ORG.RU

gtkmm уменьшение кода


0

1

Пиши программку на подобие калькулятора на С++. Но код получается большим в отличие от gtk+ на C. Вот привожу свой код (только 3 кнопки из 10) на Gtkmm:

void Widgets::on_numBut1_clicked()
{
	std::string s1 = textbox->get_text();
	std::string s2 = s1 + "1";
	textbox->set_text(s2.c_str());
}
void Widgets::on_numBut2_clicked()
{
	std::string s1 = textbox->get_text();
	std::string s2 = s1 + "2";
	textbox->set_text(s2.c_str());
}
void Widgets::on_numBut3_clicked()
{
	std::string s1 = textbox->get_text();
	std::string s2 = s1 + "3";
	textbox->set_text(s2.c_str());
}

А вот аналогичный код на C (копипаст с symmetrica.net):

static signed long int fgvalue= 0, bgvalue = 0;
static char screen[32];
static int mode = 2;

void on_numBut_clicked(gpointer user_data, GtkButton *button)
{
  int i = atoi(gtk_button_get_label(button));
  if (mode == 2) {
    bgvalue = fgvalue;
    fgvalue = 0;
    mode = 1;
  }
  fgvalue = fgvalue*10 + i;
  sprintf(screen, "%li\0", fgvalue);
  gtk_entry_set_text(GTK_ENTRY(user_data), screen);
}

В своём коде я сделала каждой кнопке по сигналу. А в примере на C все кнопки имеют один сигнал и в gtk_entry вставляется метка кнопки. Собственно прошу помощи на gtkmm реализовать похожий код. В основном не понятно как через один сигнал понять какая кнопка нажата.


В чем проблема?

void Widgets::handleButtonClick(const int buttonNum)
{
  std::string s1 = textbox->get_text();
  std::string s2 = s1 + convert_to_str(buttonNum);
  textbox->set_text(s2.c_str());
}

void Widgets::on_numBut1_clicked()
{
  handleButtonClick(1);
}

...
anonymous
()

В основном не понятно как через один сигнал понять какая кнопка нажата.

int i = atoi(gtk_button_get_label(button));

А вообще, лучше user data передавать в коннект.

А еще лучше обосновать зачем нужен c++ в этой задаче.

baverman ★★★
()
Ответ на: комментарий от yoghurt

По моей ссылке - лучше :)

m_button1.signal_clicked().connect( sigc::bind<Glib::ustring>( sigc::mem_fun(*this, &HelloWorld::on_button_clicked), "button 1") );

несомненно

aho
()
Ответ на: комментарий от aho

Технически правильное решение же, ну. Кутешники на этом месте бы пошли sender()'а пытать, что хуже.

yoghurt ★★★★★
()
Ответ на: комментарий от yoghurt

user data в коннекте у gtkmm не передается

Вообще очень сомнительное решение. gtk просто пропитан духом колбэков с дополнительными данными. И вот так просто отказаться, ради чистоты сигнатур, не понимаю.

baverman ★★★
()
Ответ на: комментарий от baverman

Коллбеки пусть остаются в Си :) В С++ им не место

yoghurt ★★★★★
()
Ответ на: комментарий от baverman

> gtk просто пропитан духом колбэков с дополнительными данными. И вот так просто отказаться, ради чистоты сигнатур, не понимаю.

Ты просто не понимаешь ценности статического контроля типов.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

ценности статического контроля типов.

Проявляется только на больших проектах. А энтерпрайз и gtkmm вещи довольно таки несовместимые.

baverman ★★★
()
Ответ на: комментарий от baverman

>> ценности статического контроля типов.

Проявляется только на больших проектах.

Не проявляется только на хелловорлдах.

А энтерпрайз и gtkmm вещи довольно таки несовместимые.

Почему? Это тот же GTK.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Не проявляется только на хелловорлдах.

Толсто же.

Почему? Это тот же GTK.

Тот же gtk сделан в окамле, очень приятные привязки. А gtkmm это уныние и пичаль.

baverman ★★★
()
Ответ на: комментарий от baverman

>> Не проявляется только на хелловорлдах.

Толсто же.

*shrug*

А gtkmm это уныние и пичаль.

Это же ынтерпрайзно.

tailgunner ★★★★★
()
Ответ на: комментарий от baverman

>Тот же gtk сделан в окамле, очень приятные привязки. А gtkmm это уныние и пичаль.

Тем не менее, gtkmm юзают серьёзные дяди

yoghurt ★★★★★
()
Ответ на: комментарий от anonymous

И вообще. Надо беспокоиться не об уменьшении кода, а о его читабельности, расширяемости и последующей сопровождаемости. Основое правило энтерпрайзности, между прочим.

anonymous
()
Ответ на: комментарий от baverman

Я C++ лучше знаю чем. Да и переучиваться неохота

ion
() автор топика
Ответ на: комментарий от anonymous

> anonymous

Спасибо за код! Сократила на 118 строк.

ion
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.