Обновить текст, отображаемый в виджете GTK+?

Будучи новичком в использовании GTK+, я не полностью осведомлен обо всех его функциях.

По сути, у меня есть виджет GtkTreeView с 4 столбцами. Мне нужно обновлять текст, отображаемый в 4 столбцах, каждые пару секунд, но я не знаю, как это сделать в GTK+.

Я знаю, что могу сбросить данные с помощью gtk_tree_store_clear, но я не уверен, как повторно заполнить столбцы и обновить окно верхнего уровня, чтобы показать эти новые данные?


person paultop6    schedule 12.04.2010    source источник


Ответы (1)


Вам нужно получить GtkTreeIter в нужную строку, а затем использовать соответствующий (специфический для модели) сеттер для изменения данных.

Например, gtk_list_store_set() для модели GtkListStore.

Нет необходимости очищать всю модель, если вы просто хотите изменить некоторые данные, это очень расточительно и медленно.

Если вам действительно нужно изменить все данные, то обязательно очистите их.

Вам не нужно беспокоиться об обновлении дисплея; представление прослушивает события модели и автоматически обновляет ее при изменении модели.

ОБНОВЛЕНИЕ:

При изменении данных (как описано в комментарии) вам не нужно «сбрасывать» старые данные. Модель владеет данными и знает, как отслеживать используемую память. Вы просто используете вышеупомянутый вызов gtk_list_store_set() по мере необходимости, чтобы поместить новые желаемые данные в модель. Вы можете делать это так часто, как это необходимо, и частота обновления раз в несколько секунд не должна вызывать никаких проблем.

Конечно, в таком случае, чтобы ваше приложение (которое, как я предполагаю, для простоты является однопоточным) быстро реагировало, у вас должен быть способ асинхронно запускать обновление, возможно, с помощью таймера. Взгляните на функцию g_timeout_add() glib, чтобы узнать, как добавить простой глобальный таймер.

person unwind    schedule 12.04.2010
comment
мне интересно, если вы можете помочь мне расслабиться. Проблема, с которой я столкнулся, заключается в попытке разместить новые данные. Мне приходится сбрасывать и заменять данные каждые несколько секунд. Я беспокоюсь, что у меня будет функция, которая постоянно зацикливается, сбрасывает и размещает новые данные. Как именно вы сбрасываете данные из столбцов и заменяете их после вызова gtk_main? - person paultop6; 13.04.2010
comment
@ paultop6: я попытался обновить ответ, чтобы решить эти проблемы. - person unwind; 14.04.2010
comment
g_timeout_add() идеально подходит для того, что я хочу сделать, но у меня проблемы с тем, что передать. У меня есть функция в классе, и ее определения выглядят так: gboolean Sysmon::GenerateListStore(void) Я вызываю g_timeout_add следующим образом: g_timeout_add(interval, GenerateListStore, NULL); что дает мне ошибку: ошибка: аргумент типа 'gboolean (Sysmon::)()' не соответствует 'gboolean ()(void)'. Я не уверен, как выполнить требования, которые ошибка говорит мне, может быть, вы знаете, расслабиться? - person paultop6; 14.04.2010
comment
@ pauktop6: Вы используете простой GTK+ API на основе C или оболочку C++? В первом случае вам нужно определить (статическую) функцию батута в вашем классе C++ и передать указатель this в качестве указателя user_data тайм-аута. Батут должен выполнить приведение и перенаправить вызов в соответствующий метод. - person unwind; 14.04.2010