С Новым годом! Форум программистов, компьютерный форум, киберфорум
Кроссплатфор­менная разработка
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.82/50: Рейтинг темы: голосов - 50, средняя оценка - 4.82
15 / 14 / 4
Регистрация: 20.05.2011
Сообщений: 296
Записей в блоге: 2

Вывод текста в textview

09.02.2012, 19:56. Показов 10388. Ответов 33
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите разобраться с textview вот код, по замыслу при нажатии кнопки Hello должен выйти текст в textview но функция не работает
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include <gtk/gtk.h>
#include "gtk_test.h"
#include <stdio.h>
 
 
int main(int argc, char *argv[])
{
    GtkWidget *window;
    GtkWidget *button,*button2;
    GtkWidget *textview;
    GtkWidget *vbox;
    
 
    complex_t x = {1,2};
        complex_t y = {3,4};
        complex_t z = mul(x,y);
    printf ("z = (%lf, %lf)\n", z.a, z.b );
    
  gtk_init (&argc, &argv);
 
    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
 
    g_signal_connect(G_OBJECT(window), "destroy",
            G_CALLBACK (destroy), NULL);
 
    button = gtk_button_new_with_label("Quit!");
    button2 = gtk_button_new_with_label("hello");
 
    g_signal_connect(G_OBJECT(button2), "clicked",
            G_CALLBACK (gtktextview),NULL);
    g_signal_connect(G_OBJECT(button), "clicked",
            G_CALLBACK (destroy),G_OBJECT(window));
    vbox = gtk_vbox_new(FALSE, 0);
 
    textview = gtk_text_view_new ();
    
 
    
    gtk_container_add(GTK_CONTAINER (window), vbox);
    gtk_container_add(GTK_CONTAINER (vbox), textview);
    gtk_container_add(GTK_CONTAINER (vbox), button2);
    gtk_container_add(GTK_CONTAINER (vbox), button);
    gtk_widget_show (textview);
    gtk_widget_show(button);
    gtk_widget_show(button2);
    gtk_widget_show(vbox);
    gtk_widget_show(window);
 
    gtk_main();
 
    return 0;
}
}
вот функция
C
1
2
3
4
5
6
7
void gtktextview(GtkWidget *widget,GtkWidget *textview)
{
GtkTextBuffer *buffer;
  buffer=gtk_text_view_get_buffer(GTK_TEXT_VIEW(textview));      
  gtk_text_buffer_set_text (buffer,"Привет, это какой-то текст", -1);
 
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.02.2012, 19:56
Ответы с готовыми решениями:

Вывод 2 ресурсных текста в TextView с использованием java кода
Хочу произвести простое действие, поменять текст, взять его из ресурсов R.string, но при этом использовать сразу 2 ресурса: ...

Выделение текста в TextView
При выделении текста в TextView android:textIsSelectable=&quot;true&quot; на моем устройстве(HTC ONE X Android 4.2.2) появляется всплывающее меню,...

TextView авторазмер текста
android studio Textview имеет размеры 100% на 50%, заполняя половину экрана. В нем написано число, которое изменяется по нажатию на...

33
310 / 233 / 15
Регистрация: 01.07.2011
Сообщений: 812
Записей в блоге: 1
09.02.2012, 23:09
Цитата Сообщение от maximus1991 Посмотреть сообщение
complex_t
где объявлен этот тип?
покажи #include "gtk_test.h"

Добавлено через 1 час 8 минут
исправленный и рабочий твой вариант
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
//~ #include "gtk_test.h"
#include <stdio.h>
#include <locale.h>
#include <gtk/gtk.h>
 
void gtktextview(GtkWidget *widget, GtkTextBuffer *buffer);
 
int main(int argc, char *argv[])
{
    GtkWidget *window;
    GtkWidget *button,*button2;
    GtkWidget *textview;
    GtkWidget *vbox;
    GtkTextBuffer *buffer; // из функции
 
    //~ добавил локаль (на всякий случай)
    setlocale(LC_ALL, "");
 
    gtk_init (&argc, &argv);
 
    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    //~ обрати внимание на приведение к типу GtkWindow
    gtk_window_set_default_size((GtkWindow *)window, 300, 200);
 
    //~ заменил destroy на gtk_exit
    g_signal_connect(G_OBJECT(window), "destroy",
            G_CALLBACK (gtk_exit), NULL); 
 
    button = gtk_button_new_with_label("Quit!");
    button2 = gtk_button_new_with_label("hello");
 
    vbox = gtk_vbox_new(FALSE, 0);
 
    textview = gtk_text_view_new();
    //~ то, что лежало в функции
    //~ обрати внимание на приведение к типу GtkTextView
    buffer=gtk_text_view_get_buffer( (GtkTextView *) textview );
 
    gtk_text_buffer_set_text(buffer, "Текст в буфере до нажатия клавиши", -1);
 
    //~ основная твоя ошибка,
    //~ что ты в функцию gtktextview передавал NULL
    //~ а надо buffer
    //~ т.е. тот объект, который ты будешь обрабатывать
    g_signal_connect(G_OBJECT(button2), "clicked",
            G_CALLBACK (gtktextview), buffer);
 
    //~ тоже вместо destroy
    g_signal_connect(G_OBJECT(button), "clicked",
            G_CALLBACK (gtk_main_quit),G_OBJECT(window));
    gtk_container_add(GTK_CONTAINER (window), vbox);
    gtk_container_add(GTK_CONTAINER (vbox), textview);
    gtk_container_add(GTK_CONTAINER (vbox), button2);
    gtk_container_add(GTK_CONTAINER (vbox), button);
    gtk_widget_show (textview);
    gtk_widget_show(button);
 
    gtk_widget_show(button2);
    gtk_widget_show(vbox);
    gtk_widget_show(window);
 
    gtk_main();
 
    return 0;
}
 
void gtktextview(GtkWidget *widget, GtkTextBuffer *buffer)
{
    gchar *some_text="Привет, это какой-то текст";
    gtk_text_buffer_set_text (buffer, some_text, -1);
}
удачи! Можешь использовать:
Перевод руководства по GTK+ 2.0
GTK+ Справочное описание
а также пакет devhelp в лине
1
15 / 14 / 4
Регистрация: 20.05.2011
Сообщений: 296
Записей в блоге: 2
10.02.2012, 13:39  [ТС]
я исправил как ты написал но выходит такая ошибка
gtktest.c: In function ‘main’:
gtktest.c:30: warning: ‘buffer’ is used uninitialized in this function

походу в при вызове функции g_signal_connect(G_OBJECT(button2), "clicked", G_CALLBACK (gtktextview), buffer); ошибка в передачи данных buffer

Добавлено через 9 минут
все переправил как показано но теперь выходит ошибка
gtktest.c: In function ‘main’:
gtktest.c:30: warning: ‘buffer’ is used uninitialized in this function

походу дело в вот этой строке g_signal_connect(G_OBJECT(button2), "clicked", G_CALLBACK (gtktextview), buffer);
0
310 / 233 / 15
Регистрация: 01.07.2011
Сообщений: 812
Записей в блоге: 1
10.02.2012, 19:26
Цитата Сообщение от maximus1991 Посмотреть сообщение
походу дело в вот этой строке g_signal_connect(G_OBJECT(button2), "clicked", G_CALLBACK (gtktextview), buffer);
с этой строкой все правильно. читай внимательно комментарии.
Цитата Сообщение от maximus1991 Посмотреть сообщение
gtktest.c:30: warning: ‘buffer’ is used uninitialized in this function
буфер не инициализирован (то есть, грубо говоря, не присвоено никакого значения). это строка 37:
buffer=gtk_text_view_get_buffer( (GtkTextView *) textview );
инициализация должна произойти до g_signal_connect
ты возьми скопируй весь мой код полностью.
также обрати внимание на то, что я изменил в функции gtktextview.
1
15 / 14 / 4
Регистрация: 20.05.2011
Сообщений: 296
Записей в блоге: 2
12.02.2012, 10:47  [ТС]
Спасибо Большое!!!
0
310 / 233 / 15
Регистрация: 01.07.2011
Сообщений: 812
Записей в блоге: 1
12.02.2012, 12:17
maximus1991, ну слава богу, я уже было подумал, что у тебя какой-то не такой гтк
если всерьез заинтересован программированием на GTK рекомендую для рисования интерфейсов использовать программу Glade. Согласись, рисовать интерфейс удобней, чем писать его функциями. Только не libglade, а GtkBuilder (libglade - дериватив). опции компилятора для gcc (или g++) соответственно:
C
1
`pkg-config --libs gtk+-2.0 gmodule-2.0` `pkg-config --cflags gtk+-2.0 gmodule-2.0`
в коде должно быть:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
GtkBuilder *builder;
    //~ запуск gtk
    gtk_init(&argc, &argv);
    //~ запуск билдера (для файла glade)
    builder=gtk_builder_new();
 
// подключаем файл с нашим граф. интерфейсом
    gtk_builder_add_from_file(builder, "you_file.glade", &error);
    window1=GTK_WIDGET(gtk_builder_get_object(builder, "window1"));
    but_ok=GTK_WIDGET(gtk_builder_get_object(builder, "but_ok"));
    but_cancel=GTK_WIDGET(gtk_builder_get_object(builder, "but_cancel"));
 
    //~ привязка сигналов 
// то есть вместо g_signal_connect
    gtk_builder_connect_signals (builder, NULL);
По Glade есть статьи в тырнете.

Если вообще-вообще заинтересован в программировании на GTK - рекомендую IDE "Anjuta". Она специально заточена под gtk.
0
15 / 14 / 4
Регистрация: 20.05.2011
Сообщений: 296
Записей в блоге: 2
14.02.2012, 13:46  [ТС]
спасибо за помощь я так то любитель программировать сейчас вот си GTK+ учу. anjutu и glade пробовал, но решил с начало изучить как это все работает а потом только IDE пользоваться. не подскажешь а как передать данные не только buffer но и допустим данные из entry в функцию
g_signal_connect(G_OBJECT(button2), "clicked", G_CALLBACK (gtktextview), buffer);
0
310 / 233 / 15
Регистрация: 01.07.2011
Сообщений: 812
Записей в блоге: 1
14.02.2012, 22:39
maximus1991,
Цитата Сообщение от maximus1991 Посмотреть сообщение
как передать данные не только buffer но и допустим данные из entry
прикрепил файлы с кодами. desktop - это утилитка, которая создает файл ярлыка для рабочего стола (должна создавать, я не знаю, работает ли? но то, что ты спросил - показывает). писал ее давно, код в некоторых местах мягко говоря некорректный, но главное: видно, как передаются данные, в частности entry.
gtk_prb_bldr - видно, как передаются и меняются туда-сюда данные. тупо проба.

Идея проста:
чтобы не париться передавать кучу параметров в функции, я объявляю объекты entry и обрабатываемые переменные статическими (там увидишь объявления перед main). то есть static

обращаю внимание! некоторые вещи описаны в glade файле, а не в коде. то есть по-любому glade нужен.
Вложения
Тип файла: zip desktop.zip (4.3 Кб, 32 просмотров)
Тип файла: zip gtk_prb3.c.zip (1.0 Кб, 35 просмотров)
Тип файла: zip gtk_prb_bldr.c.zip (1.5 Кб, 41 просмотров)
1
15 / 14 / 4
Регистрация: 20.05.2011
Сообщений: 296
Записей в блоге: 2
15.02.2012, 16:26  [ТС]
извини что замучал но после добавления static GtkEntry *entry;
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include <gtk/gtk.h>
#include "gtk_test.h"
#include <stdio.h>
#include <locale.h>
#include <stdlib.h>
static  GtkEntry *entry;
 
 
 
int main(int argc, char *argv[])
{
        GtkWidget *window;
        GtkWidget *button,*button2;
        GtkWidget *textview;
        GtkWidget *vbox;
    GtkTextBuffer *buffer;
         // из функции
 
        //~ добавил локаль (на всякий случай)
        setlocale(LC_ALL, "");
 
        gtk_init (&argc, &argv);
 
        window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
        //~ обрати внимание на приведение к типу GtkWindow
        gtk_window_set_default_size((GtkWindow *)window, 300, 200);
 
        //~ заменил destroy на gtk_exit
        g_signal_connect(G_OBJECT(window), "destroy",
                        G_CALLBACK (gtk_exit), NULL); 
 
        button = gtk_button_new_with_label("Quit!");
        button2 = gtk_button_new_with_label("hello");
    entry = gtk_entry_new();
        vbox = gtk_vbox_new(FALSE, 0);
    
    gtk_entry_set_text(GTK_ENTRY(entry1),"hello");
        textview = gtk_text_view_new();
        //~ то, что лежало в функции
        //~ обрати внимание на приведение к типу GtkTextView
        buffer=gtk_text_view_get_buffer( (GtkTextView *) textview );
 
        gtk_text_buffer_set_text(buffer, "Текст в буфере до нажатия клавиши", -1);
 
        //~ основная твоя ошибка,
        //~ что ты в функцию gtktextview передавал NULL
        //~ а надо buffer
        //~ т.е. тот объект, который ты будешь обрабатывать
        g_signal_connect(G_OBJECT(button2), "clicked",
                        G_CALLBACK (gtktextview), buffer);
 
        //~ тоже вместо destroy
        g_signal_connect(G_OBJECT(button), "clicked",
                        G_CALLBACK (gtk_main_quit),G_OBJECT(window));
        gtk_container_add(GTK_CONTAINER (window), vbox);
        gtk_container_add(GTK_CONTAINER (vbox), textview);
        gtk_container_add(GTK_CONTAINER (vbox), entry);
        gtk_container_add(GTK_CONTAINER (vbox), button2);
        gtk_container_add(GTK_CONTAINER (vbox), button);
        gtk_widget_show (textview);
        gtk_widget_show(button);
    gtk_widget_show(entry);
        gtk_widget_show(button2);
        gtk_widget_show(vbox);
        gtk_widget_show(window);
 
        gtk_main();
 
        return 0;
}
вывводит ошибку gtktest.c: In function ‘main’:
gtktest.c:34: warning: assignment from incompatible pointer type
gtktest.c:37: error: ‘entry1’ undeclared (first use in this function)
gtktest.c:37: error: (Each undeclared identifier is reported only once
gtktest.c:37: error: for each function it appears in.)
gtktest.c:57: warning: passing argument 2 of ‘gtk_container_add’ from incompatible pointer type
/usr/include/gtk-2.0/gtk/gtkcontainer.h:111: note: expected ‘struct GtkWidget *’ but argument is of type ‘struct GtkEntry *’
gtktest.c:62: warning: passing argument 1 of ‘gtk_widget_show’ from incompatible pointer type
/usr/include/gtk-2.0/gtk/gtkwidget.h:848: note: expected ‘struct GtkWidget *’ but argument is of type ‘struct GtkEntry *
0
310 / 233 / 15
Регистрация: 01.07.2011
Сообщений: 812
Записей в блоге: 1
15.02.2012, 20:29
Ну, дорогой мой, это называется "невнимательность"
Цитата Сообщение от maximus1991 Посмотреть сообщение
static GtkEntry *entry;
Цитата Сообщение от maximus1991 Посмотреть сообщение
gtk_entry_set_text(GTK_ENTRY(entry1),"hello");
ошибка expected ‘struct GtkWidget *’ but argument is of type ‘struct GtkEntry * - означает, что тип переменной не тот, который ты пытаешься передать в качестве аргумента.
лечится приведением типов:
gtk_widget_show( (GtkWidget *) entry);
Обрати внимание, я уже куски кода с приведением тебе приводил.
Твой код без ошибок:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include <gtk/gtk.h>
//~ #include "gtk_test.h"
#include <stdio.h>
#include <locale.h>
#include <stdlib.h>
 
static  GtkEntry *entry;
 
void gtktextview(void) {} // заглушка
 
int main(int argc, char *argv[])
{
        GtkWidget *window;
        GtkWidget *button,*button2;
        GtkWidget *textview;
        GtkWidget *vbox;
        GtkTextBuffer *buffer;
         // из функции
 
        //~ добавил локаль (на всякий случай)
        setlocale(LC_ALL, "");
 
        gtk_init (&argc, &argv);
 
        window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
        //~ обрати внимание на приведение к типу GtkWindow
        gtk_window_set_default_size((GtkWindow *)window, 300, 200);
 
        //~ заменил destroy на gtk_exit
        g_signal_connect(G_OBJECT(window), "destroy",
                        G_CALLBACK (gtk_exit), NULL); 
 
        button = gtk_button_new_with_label("Quit!");
        button2 = gtk_button_new_with_label("hello");
        entry = (GtkEntry *)gtk_entry_new();
        vbox = gtk_vbox_new(FALSE, 0);
        
        gtk_entry_set_text(GTK_ENTRY(entry),"hello");
        textview = gtk_text_view_new();
        //~ то, что лежало в функции
        //~ обрати внимание на приведение к типу GtkTextView
        buffer=gtk_text_view_get_buffer( (GtkTextView *) textview );
 
        gtk_text_buffer_set_text(buffer, "Текст в буфере до нажатия клавиши", -1);
 
        //~ основная твоя ошибка,
        //~ что ты в функцию gtktextview передавал NULL
        //~ а надо buffer
        //~ т.е. тот объект, который ты будешь обрабатывать
        g_signal_connect(G_OBJECT(button2), "clicked",
                        G_CALLBACK (gtktextview), buffer);
 
        //~ тоже вместо destroy
        g_signal_connect(G_OBJECT(button), "clicked",
                        G_CALLBACK (gtk_main_quit),G_OBJECT(window));
        gtk_container_add(GTK_CONTAINER (window), vbox);
        gtk_container_add(GTK_CONTAINER (vbox), textview);
        gtk_container_add(GTK_CONTAINER (vbox), (GtkWidget *)entry);
        gtk_container_add(GTK_CONTAINER (vbox), button2);
        gtk_container_add(GTK_CONTAINER (vbox), button);
        gtk_widget_show (textview);
        gtk_widget_show(button);
        gtk_widget_show( (GtkWidget *) entry);
        gtk_widget_show(button2);
        gtk_widget_show(vbox);
        gtk_widget_show(window);
 
        gtk_main();
 
        return 0;
}
Добавлено через 3 минуты
маленький совет: если ты хочешь обрабатывать некоторые объекты скопом - их можно объявить массивом.

Добавлено через 1 минуту
небольшой совет.
вместо отображения каждого объекта:
Цитата Сообщение от maximus1991 Посмотреть сообщение
C
1
2
3
4
5
6
gtk_widget_show (textview); 
gtk_widget_show(button); 
gtk_widget_show(entry); 
gtk_widget_show(button2); 
gtk_widget_show(vbox); 
gtk_widget_show(window);
можно воспользоваться функцией:
C
1
gtk_widget_show_all (window);
Добавлено через 2 часа 3 минуты
maximus1991, пожалуйста
таки рекомендую тебе осваивать GTK вместе с glade, чтобы не забивать голову функциями для создания интерфейса. И кода меньше становится.
1
15 / 14 / 4
Регистрация: 20.05.2011
Сообщений: 296
Записей в блоге: 2
16.02.2012, 15:53  [ТС]
извини что надоел но так и недогоню почему тогда вот это функция не работает . вроде entry объявлено так static GtkEntry *entry;
[C
void gtktextview(GtkWidget *widget, gpointer user_data)
{
gpointer buffer=user_data;
gtk_entry_set_text(GTK_ENTRY(entry), "name");
gchar *some_text="Привет, это какой-то текст";
gtk_text_buffer_set_text (buffer, some_text, -1);
}][/C]
ошибка gtk_test.c: In function ‘gtktextview’:
gtk_test.c:10: error: ‘entry’ undeclared (first use in this function)
gtk_test.c:10: error: (Each undeclared identifier is reported only once
gtk_test.c:10: error: for each function it appears in.)

видно какую то мелочь не знаю.

Добавлено через 2 часа 2 минуты
извини что замучал но не как не пойму почему не работает эта функция
C
1
2
3
4
5
6
7
void gtktextview(GtkWidget *widget,  gpointer user_data)
{
    gpointer buffer=user_data;
    gtk_entry_set_text(GTK_ENTRY(entry), "name");
        gchar *some_text="Привет, это какой-то текст";
        gtk_text_buffer_set_text (buffer, some_text, -1);
}
вот ошибка gtk_test.c: In function ‘gtktextview’:
gtk_test.c:10: error: ‘entry’ undeclared (first use in this function)
gtk_test.c:10: error: (Each undeclared identifier is reported only once
gtk_test.c:10: error: for each function it appears in.)
вроде entery описал так static GtkEntry *entry;

Добавлено через 1 минуту
извиняюсь за повторение одного и того же текста у меня инет тупит
0
310 / 233 / 15
Регистрация: 01.07.2011
Сообщений: 812
Записей в блоге: 1
16.02.2012, 17:12
итак, смотрим, что тут написано:
gtk_test.c:10: error: ‘entry’ undeclared (first use in this function)
переменная "entry" необъявлена (первое использование в функции).
А это потому, что она не объявлена в функции!
Цитата Сообщение от maximus1991 Посмотреть сообщение
C
1
void gtktextview(GtkWidget *widget, gpointer user_data)
а должно быть:
C
1
void gtktextview(GtkEntry *entry, gpointer user_data)
Смотри: что у нас передается с сигналом?
Ответ: первый аргумент - объект (GtkWidget *widget), второй аргумент - данные этого объекта (gpointer data). (т.е. не сами данные, а указатели на них).
что ты должен был в функцию сунуть? правильно widget:
C
1
        gtk_entry_set_text(GTK_ENTRY(widget), "name");
либо ты должен объявить функцию так:
C
1
void gtktextview(GtkEntry *entry, gpointer user_data)
но тогда ты должен сунуть первый аргумент entry а не widget.
C
1
        gtk_entry_set_text(entry, "name"); // здесь можно уже без GTK_ENTRY
Будут вопросы - пиши.
1
15 / 14 / 4
Регистрация: 20.05.2011
Сообщений: 296
Записей в блоге: 2
16.02.2012, 21:23  [ТС]
спасибо за подробное объяснение,в этом я и пытаюсь разобраться потом перейду на glade)

Добавлено через 1 час 5 минут
а не мог бы по подробнее рассказать про функции , можно ли писать 3 аргумента т.е.

void gtktextview(GtkWidget *Widget, GtkEntry *entry, gpointer user_data)?
ты пишешь что Ответ: первый аргумент - объект (GtkWidget *widget), второй аргумент - данные этого объекта (gpointer data). (т.е. не сами данные, а указатели на них).
что ты должен был в функцию сунуть?
C
1
2
3
4
5
6
7
void gtktextview(GtkWidget *widget,  gpointer user_data)
{
        gpointer buffer=user_data;
        gtk_entry_set_text(GTK_ENTRY(widget), "name");
        gchar *some_text="Привет, это какой-то текст";
        gtk_text_buffer_set_text (buffer, some_text, -1);
}
данные этого объекта (gpointer data)(т.е. не сами данные, а указатели на них) смысле указатель entry будет или все таки параметр который я с сигналом послал т.е buffer
0
310 / 233 / 15
Регистрация: 01.07.2011
Сообщений: 812
Записей в блоге: 1
16.02.2012, 22:11
Цитата Сообщение от maximus1991 Посмотреть сообщение
можно ли писать 3 аргумента т.е.
в том-то и дело, что нет.

Цитата Сообщение от maximus1991 Посмотреть сообщение
второй аргумент - данные этого объекта (gpointer data). (т.е. не сами данные, а указатели на них).
если ты передаешь в функцию указатель на строку, то функцией изменяется сама строка. если передать в функцию по значению, то передастся не сама переменная, а создастся копия значения переменной. в нашем данном случае (если данные - строка) передается указатель на первый элемент.

Цитата Сообщение от maximus1991 Посмотреть сообщение
данные этого объекта (gpointer data)(т.е. не сами данные, а указатели на них) смысле указатель entry будет или все таки параметр который я с сигналом послал т.е buffer
объявлять буфер здесь нет смысла. чтобы передать
Цитата Сообщение от maximus1991 Посмотреть сообщение
C
1
gtk_text_buffer_set_text (buffer, some_text, -1);
тут должен быть не buffer, а объект, то есть GTK_ENTRY(widget)
1
15 / 14 / 4
Регистрация: 20.05.2011
Сообщений: 296
Записей в блоге: 2
17.02.2012, 14:36  [ТС]
ты наверное меня не так понял вот код
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include <gtk/gtk.h>
#include "gtk_test.h"
#include <stdio.h>
#include <locale.h>
#include <stdlib.h>
 
static  GtkEntry *entry;
 
 
 
int main(int argc, char *argv[])
{
        GtkWidget *window;
        GtkWidget *button,*button2;
        GtkWidget *textview;
        GtkWidget *vbox;
        GtkTextBuffer *buffer;
         // из функции
 
        //~ добавил локаль (на всякий случай)
        setlocale(LC_ALL, "");
 
        gtk_init (&argc, &argv);
 
        window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
        //~ обрати внимание на приведение к типу GtkWindow
        gtk_window_set_default_size((GtkWindow *)window, 300, 200);
 
        //~ заменил destroy на gtk_exit
        g_signal_connect(G_OBJECT(window), "destroy",
                        G_CALLBACK (gtk_exit), NULL); 
 
        button = gtk_button_new_with_label("Quit!");
        button2 = gtk_button_new_with_label("hello");
        entry = (GtkEntry *)gtk_entry_new();
        vbox = gtk_vbox_new(FALSE, 0);
        
        
        textview = gtk_text_view_new();
        //~ то, что лежало в функции
        //~ обрати внимание на приведение к типу GtkTextView
        buffer=gtk_text_view_get_buffer( (GtkTextView *) textview );
 
        gtk_text_buffer_set_text(buffer, "Текст в буфере до нажатия клавиши", -1);
 
        //~ основная твоя ошибка,
        //~ что ты в функцию gtktextview передавал NULL
        //~ а надо buffer
        //~ т.е. тот объект, который ты будешь обрабатывать
        g_signal_connect(G_OBJECT(button2), "clicked",
                        G_CALLBACK (gtktextview), buffer);
 
        //~ тоже вместо destroy
        g_signal_connect(G_OBJECT(button), "clicked",
                        G_CALLBACK (gtk_main_quit),G_OBJECT(window));
        gtk_container_add(GTK_CONTAINER (window), vbox);
        gtk_container_add(GTK_CONTAINER (vbox), textview);
        gtk_container_add(GTK_CONTAINER (vbox), (GtkWidget *)entry);
        gtk_container_add(GTK_CONTAINER (vbox), button2);
        gtk_container_add(GTK_CONTAINER (vbox), button);
        gtk_widget_show (textview);
        gtk_widget_show(button);
        gtk_widget_show( (GtkWidget *) entry);
        gtk_widget_show(button2);
        gtk_widget_show(vbox);
        gtk_widget_show(window);
 
        gtk_main();
 
        return 0;
}
вот код функции
C
1
2
3
4
5
6
7
void gtktextview(GtkEntry *entry,  gpointer user_data)
{
    gpointer buffer=user_data;
    gtk_entry_set_text(entry, "name");
        gchar *some_text="Привет, это какой-то текст";
        gtk_text_buffer_set_text (buffer, some_text, -1);
}
дело в том что допустим я хочу чтобы при вызове сигнала у меня в строке textview появилась другая надпись и в строке entry тоже поменялась надпись, или из строки entry текст перешел в textview
0
310 / 233 / 15
Регистрация: 01.07.2011
Сообщений: 812
Записей в блоге: 1
18.02.2012, 18:37
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#include <gtk/gtk.h>
//~ #include "gtk_test.h"
#include <stdio.h>
#include <locale.h>
#include <stdlib.h>
 
static  GtkWidget *entry;
static  GtkTextBuffer *buffer;
 
void gtktextview(GtkWidget *widget,  gpointer user_data);
 
int main(int argc, char *argv[])
{
        GtkWidget *window;
        GtkWidget *button,*button2;
        GtkWidget *textview;
        GtkWidget *vbox;
         // из функции
 
        //~ добавил локаль (на всякий случай)
        setlocale(LC_ALL, "");
 
        gtk_init (&argc, &argv);
 
        window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
        //~ обрати внимание на приведение к типу GtkWindow
        gtk_window_set_default_size((GtkWindow *)window, 300, 200);
 
        //~ заменил destroy на gtk_exit
        g_signal_connect(G_OBJECT(window), "destroy",
                        G_CALLBACK (gtk_exit), NULL); 
 
        button  = gtk_button_new_with_label("Quit!");
        button2 = gtk_button_new_with_label("hello");
        entry   = gtk_entry_new();
        vbox    = gtk_vbox_new(FALSE, 0);
        
    gtk_entry_set_text(GTK_ENTRY(entry), "текст");
        
        textview = gtk_text_view_new();
        //~ то, что лежало в функции
        //~ обрати внимание на приведение к типу GtkTextView
        buffer=gtk_text_view_get_buffer( (GtkTextView *) textview );
 
        gtk_text_buffer_set_text(buffer, "Текст в буфере до нажатия клавиши", -1);
 
        //~ основная твоя ошибка,
        //~ что ты в функцию gtktextview передавал NULL
        //~ а надо buffer
        //~ т.е. тот объект, который ты будешь обрабатывать
        g_signal_connect(G_OBJECT(button2), "clicked",
                        G_CALLBACK (gtktextview), entry);
 
        //~ тоже вместо destroy
        g_signal_connect(G_OBJECT(button), "clicked",
                        G_CALLBACK (gtk_main_quit),G_OBJECT(window));
        gtk_container_add(GTK_CONTAINER (window), vbox);
        gtk_container_add(GTK_CONTAINER (vbox), textview);
        gtk_container_add(GTK_CONTAINER (vbox), entry);
        gtk_container_add(GTK_CONTAINER (vbox), button2);
        gtk_container_add(GTK_CONTAINER (vbox), button);
        gtk_widget_show (textview);
        gtk_widget_show(button);
        gtk_widget_show( (GtkWidget *) entry);
        gtk_widget_show(button2);
        gtk_widget_show(vbox);
        gtk_widget_show(window);
 
        gtk_main();
 
        return 0;
}
 
void gtktextview(GtkWidget *widget,  gpointer user_data)
{
        //~ gpointer buffer=user_data; // - это необязательно, к тому же неправильно
        gchar *entry_text;
    gchar *some_text="Привет, это какой-то текст";
    entry_text = gtk_entry_get_text( GTK_ENTRY(entry) );
 
    //~ GTK_BUTTON(widget) и (GtkButton *)widget - одно и тоже
    gtk_button_set_label(GTK_BUTTON(widget), entry_text);
        gtk_entry_set_text((GtkEntry *)entry, entry_text);
        gtk_text_buffer_set_text (buffer, some_text, -1);
}
Добавлено через 6 минут
что куда и как передается
могу также посоветовать книгу "Разработка Linux-приложений" Д. Колисниченко 2011 г.
0
310 / 233 / 15
Регистрация: 01.07.2011
Сообщений: 812
Записей в блоге: 1
18.02.2012, 23:23
утилитка на GTK, которая создает символьные ссылки.
make_link32 - 32-х битная.
make_link64 - 64-х битная соответственно.

смотри, изучай. будут вопросы - пиши.
Вложения
Тип файла: zip make_link.zip (11.5 Кб, 26 просмотров)
1
15 / 14 / 4
Регистрация: 20.05.2011
Сообщений: 296
Записей в блоге: 2
25.02.2012, 19:01  [ТС]
не подскажешь как работать с числами, то есть при вводе числа в entry и нажатии на button что бы в строку label вывел какую нибудь сумму и разность чисел, вот пример, но при запуске выводи ерунду какую то((
C
1
2
3
4
5
6
7
8
9
10
void text(GtkWidget *widget, gpointer data)
{
        text1 = gtk_entry_get_text(GTK_ENTRY(entry1));
 
        int a1; 
        a1 = text1+12;
        sprintf(screen, "%ld\0", a1);
        gtk_label_set_text(GTK_LABEL(label1), screen);
        
}
0
310 / 233 / 15
Регистрация: 01.07.2011
Сообщений: 812
Записей в блоге: 1
29.02.2012, 21:16
maximus1991, э-э-э... батенька, это вам надо основы языка Си сначала освоить/вспомнить.
есть понятие символьные массивы (содержат символы) и есть целочисленные переменные (содержать целые числа).
т.е. тебе надо использовать функцию atoi(), подключить файл #include <stdlib.h>
C
1
2
3
int entry_int;
entry_int = atoi(text1); // возвращает числовое значение
a1 = entry_int+12; // далее используем уже числовую переменную
man по atoi
ATOI(3) Linux Programmer's Manual ATOI(3)



ИМЯ
atoi, atol, atoll, atoq - преобразует строку символов в целое число

СИНТАКСИС
#include <stdlib.h>

int atoi(const char *nptr);
long atol(const char *nptr);
long long atoll(const char *nptr);
long long atoq(const char *nptr);

ОПИСАНИЕ
Функция atoi() преобразует начальную часть строки, на которую указывает
nptr, в целое число типа int. Действие аналогично

strtol(nptr, (char **)NULL, 10);

за исключением того, что atoi() не сообщает об ошибках.

Функции atol() и atoll() ведут себя так же, как и atoi(), но только
преобразуют начальную часть строки в значение типа long или long long.
atoq() -- это устаревшее название функции atoll().

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
Преобразованное число.
1
15 / 14 / 4
Регистрация: 20.05.2011
Сообщений: 296
Записей в блоге: 2
02.03.2012, 19:59  [ТС]
извини что надоел но так не доганю почему не работает щас?
C
1
2
3
4
5
6
7
text1 = gtk_entry_get_text(GTK_ENTRY(entry1));
        int a1;
        int entry_int;
        entry_int = atoi(text1); 
        a1 = entry_int+12; 
         sprintf(screen, "%li\0", a1);
        gtk_label_set_text(GTK_LABEL(label1), a1);
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
02.03.2012, 19:59
Помогаю со студенческими работами здесь

TextView выравнивание текста
В текст в TextView по умолчанию идет выравнивание текста по левому краю. Как выровнять текст по всей ширине, как если бы в Word вы нажали...

Обновление текста в TextView
Подскажите как лучше сделать. У меня постоянно изменяется значение переменной и ее нужно выводить. Пока что сделал так: ...

Анимация печатания текста в TextView
Приветствую всех. Сразу покажу, чего хочу добиться (черные косяки вокруг букв в планы не входят :D). Есть String, есть...

Динамическое изменение текста в TextView
Есть TextView в RelativeLayout, которое вмещает в себя надпись &quot;Привет мир&quot;, а вот надпись &quot;Привет весь мир&quot; уже не влезает. ...

Отображение текста (из файла) в textView
В общем не могу разобраться как сделать так что бы при нажатии на кнопку (Button) в компоненте textView отображался текст, который будет...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru