LINUX.ORG.RU

gtk + clist + gtk_clist_set_column_title


0

0

Почему и как это исправить.
Когда создаю clist, (gtk_clist_new), создаю метки (gtk_label_new),
и вставляю их в clist, вешаю gtk_signal_connect на нажатие.

Все в порядке.
Потом по определенном событию я titles на всех columns меняю.
И всё, titles перестает реагировать на нажатие кнопки мыши. Оно вообще
ни одного сигнала не передает.

В чем причина?

★★

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

GtkWidget *dbclist;

main_function
{
dbclist = gtk_clist_new (5);
gtk_widget_set_name (dbclist, "dbclist");
gtk_object_set_data_full (GTK_OBJECT (mainwindow), "dbclist", dbclist,
(GtkDestroyNotify) gtk_widget_unref);
gtk_widget_show (dbclist);

gtk_clist_set_column_width (GTK_CLIST (dbclist), 0, 80);
gtk_clist_set_column_width (GTK_CLIST (dbclist), 1, 80);
gtk_clist_set_column_width (GTK_CLIST (dbclist), 2, 80);
gtk_clist_set_column_width (GTK_CLIST (dbclist), 3, 80);
gtk_clist_set_column_width (GTK_CLIST (dbclist), 4, 80);
gtk_clist_set_selection_mode (GTK_CLIST (dbclist), GTK_SELECTION_EXTENDED);
gtk_clist_column_titles_show (GTK_CLIST (dbclist));

db_clistlabel1 = gtk_label_new ("label1");
gtk_widget_set_name (db_clistlabel1, "db_clistlabel1");
gtk_object_set_data_full (GTK_OBJECT (mainwindow), "db_clistlabel1", db_clistlabel1,
(GtkDestroyNotify) gtk_widget_unref);
gtk_widget_show (db_clistlabel1);

gtk_clist_set_column_widget (GTK_CLIST (dbclist), 0, db_clistlabel1);
gtk_signal_connect (GTK_OBJECT (db_clistlabel1), "state_changed",
GTK_SIGNAL_FUNC (on_db_clistlabel1_state_changed), NULL);
}

function1
{
gtk_clist_set_column_title (GTK_CLIST (dbclist), 0, "t");
}

void on_db_clistlabel1_state_changed (GtkWidget *widget,
GtkStateType state,
gpointer user_data)
{
printf ("\a\n");
}

Привожу только важный код. На синтаксис не смотрите.
function1 вызывается по нажатию другой кнопки.
Код кнопки не привожу.

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

Ну вопервых с чего ты взял что сигнал "state_changed" для label это сигнал нажатия на метку? А во вторых используй сигнал "click_column" для clist: g_signal_connect ((gpointer) dbclist, "click_column", G_CALLBACK (on_dbclist_click_column), NULL);

void on_dbclist_click_column (GtkCList *clist, gint column, gpointer user_data) {

}

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

Ну вопервых с чего ты взял что сигнал "state_changed" для label это сигнал нажатия на метку?
А во вторых используй сигнал "click_column" для clist:
g_signal_connect ((gpointer) dbclist, "click_column",
G_CALLBACK (on_dbclist_click_column),
NULL);

void
on_dbclist_click_column (GtkCList *clist,
gint column,
gpointer user_data)
{

}

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

Я еще не пробывал но сразу скажу.
Что дело не в том какой callback ловим.
Я просто в "state_changed" проверял state == GTK_STATE_ACTIVE.
и если это так то printf ("\a\n");

Просто все работает, нажимаешь на column он издает сигнал.
Потом на другую кнопку в приложении кликаешь которя меняет title.
Title меняется, и все дальнейшие нажатия на column не приводят к звуку.

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

Ничего чего странного. Ведь когда меняешь title в gtk_clist автоматически удаляются виджеты, которые title отображают и на их место создаются новые, в частности, удаляется твой button и все callback'и на сигналы, связанные с ним. Поэтому больше callback и не вызывается.

Смотри gtk/gtkclist.c

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

Нормально все сделано в гтк. Просто головой надо думать, а не выдумывать черезжопные способы.

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

Хе батенька, да вам докуменитацию читать надо!
void gtk_clist_set_column_title (GtkCList *clist,
gint column,
const gchar *title);

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

Последнему анонимусу. Ты вообще все сообщения читал? Сказано ведь что эта функция удаляет все label, и создает новые из-за этого callback'и не перехватываются.

Прочти еще раз все вышесказанное.

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

Насколько я понял тебе нужно изменять title и ловить сигнал по нажатию на title.

Тогда:
1)Создаешь CList
2)Цепляешь к нему label gtk_clist_set_column_widget (GTK_CLIST (dbclist), 0, db_clistlabel1);
3)Вешаешь callbacks
g_signal_connect ((gpointer) dbclist, "click_column", G_CALLBACK (on_dbclist_click_column), NULL);
4)В callbacks вызываешь gtk_clist_set_column_title (GTK_CLIST (dbclist), 0, "t");
Все работает!

НЕ будет работать если ты будешь изменять виджет(а не надпись на виджете!!!) который ты цепляешь к clist. Тогда соответственно callbacks привязанный к этому виджету будет убиватся вместе с виджетом.

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

Вот именно так у меня и не работает.

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