Category Archives: GTK and QT

[GTK] 4.박스 고급 및 한글 처리

#include <gtk/gtk.h>
int main ( int argc, char *argv[] )
{
GtkWidget *window; // 윈도우
GtkWidget *button; // 버튼
GtkWidget *hbox; // 박스
GtkWidget *vbox; // 박스
GtkWidget *sep; // 분리선

gtk_init (&argc, &argv);

window = gtk_window_new (GTK_WINDOW_TOPLEVEL); // 윈도우를 만든다
gtk_window_set_title(GTK_WINDOW(window),"박스 패킹"); // 윈도우에 타이틀을 정해준다

g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (gtk_main_quit), NULL);
// 중간에 함수를 거치지 않고 바로 gtk_main_quit호출 이런식으로 써도 욕안먹을려나 몰라
gtk_container_set_border_width (GTK_CONTAINER (window), 10); // 윈도우의 여백을 10 으로 지정,

hbox = gtk_hbox_new(1,0); // GtkWidget * gtk_hbox_new (gint homogeneous (가운데 정렬), gint spacing);
vbox = gtk_vbox_new(1,0); // 수평박스와 수직박스를 하나씩 만든다.

button = gtk_button_new_with_label("수평버튼1");
gtk_box_pack_start(GTK_BOX(hbox),button,1,1,0); //버튼1을 수평박스 첫번째(왼쪽)에 패킹한다
//void gtk_box_pack_start(GtkBox *box, GtkWidget *child, gint expand, gint fill, gint padding);
// 패킹할 박스, 패킹할 위젯(버튼), 여백조절, 여백조절, 여백조절
gtk_widget_show (button);

button = gtk_button_new_with_label("수평버튼2");
gtk_box_pack_end(GTK_BOX(hbox),button,1,1,0); //버튼2를 수평박스 마지막(오른쪽)에 패킹한다
gtk_widget_show(button);

gtk_box_pack_start(GTK_BOX(vbox),hbox,1,1,0); // 수직박스에 수평박스 넣기

sep = gtk_hseparator_new(); // 수평분리선을 하나 만든후
gtk_box_pack_start(GTK_BOX(vbox),sep,0,0,0); // 수직박스에 더해준다.
gtk_widget_show(sep); // 그리고 보여준다

button = gtk_button_new_with_label("수직버튼1");
gtk_box_pack_start(GTK_BOX(vbox),button,1,1,0);
gtk_widget_show(button);

button = gtk_button_new_with_label("수직버튼2");
gtk_box_pack_start(GTK_BOX(vbox),button,1,1,0);
gtk_widget_show(button);

gtk_container_add(GTK_CONTAINER(window),vbox); // 수직박스만 윈도우에 올린다.

gtk_widget_show(hbox); // 수평박스를 보여준다
gtk_widget_show(vbox); // 수직박으를 보여준다

gtk_widget_show (window);
gtk_main ();
return 0;
}


** 한글 처리방법
VS에서 저장할때
파일 -> 저장 고급 옵션 -> 인코딩 -> 유니코드(서명 없는 UTF-8, 또는 BOM 아님) , Unix(LF)로
저장한후 컴파일한다.
사용자 삽입 이미지
사용자 삽입 이미지


[GTK] 3.박스 입문

01: #include <gtk/gtk.h>
02:
03: static void callback( GtkWidget *widget, gpointer data )
04: {
05: g_print ("Hello again - %s was pressed\n", (gchar *) data); //data 를 화면에 뿌려준다
06: }
07:
08: static gboolean delete_event( GtkWidget *widget, GdkEvent *event, gpointer data )
09: {
10: gtk_main_quit (); // GTK 메인루프를 종료시킨다
11: return FALSE;
12: }
13:
14: int main(int argc, char *argv[])
15: {
16: GtkWidget *window;
17: GtkWidget *button;
18: GtkWidget *box1;
19:
20: gtk_init (&argc, &argv);
21:
22: window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
23:
24: // window에 타이틀 지정
25: gtk_window_set_title (GTK_WINDOW (window), "Hello Buttons!");
26:
27: // 종료 이벤트 처리
28: g_signal_connect (G_OBJECT (window), "delete_event", G_CALLBACK (delete_event), NULL);
29:
30: // 경계선 여백 지정
31: gtk_container_set_border_width (GTK_CONTAINER (window), 10);
32:
33: // 박스 생성
34: box1 = gtk_hbox_new (FALSE, 0);
35:
36: // 박스를 윈도우에 넣는다
37: gtk_container_add (GTK_CONTAINER (window), box1);
38:
39: // 라벨을 가지고 버튼을 만든다
40: button = gtk_button_new_with_label ("Button 1");
41:
42: // 버튼1이 클릭되면 "button 1"이라는 값을 전달하며 callback 함수를 호출하게 한다
43: g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (callback), (gpointer) "button 1");
44:
45: // 버튼1을 박스에 묶는다
46: gtk_box_pack_start (GTK_BOX(box1), button, TRUE, TRUE, 0);
47:
48: // 버튼1을 보여준다
49: gtk_widget_show (button);
50:
51: // 버튼2를 만든다 (재활용)
52: button = gtk_button_new_with_label ("Button 2");
53:
54: // 역시 버튼2가 클릭되면 "button 2" 를가지고 callback 함수를 호출한다
55: g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (callback), (gpointer) "button 2");
56:
57: // 버튼2를 박스에 묶는다
58: gtk_box_pack_start(GTK_BOX (box1), button, TRUE, TRUE, 0);
59:
60: // 버튼과 박스, 윈도우를 보여준다
61: gtk_widget_show (button);
62: gtk_widget_show (box1);
63: gtk_widget_show (window);
64:
65: gtk_main (); // 응답을 기다린다
66:
67: return 0;
68: }

[GTK] 2. 버튼으로 Hellow orld 출력하기

01: #include <gtk/gtk.h>
02:
03: // GTK 공식 TUT에서 쓰는 함수이름이 헷갈려서 임의로 변경을 했다. (앞에 F 를 붙이는것으로)
04: // 또한 이 예제에서는 Hellow orld 버튼을 눌러도 창이 닫히지 않는다.
05: static void Fhello( GtkWidget *widget, gpointer data ) // 함수앞에 static은 써도그만 안써도그만
06: {
07: g_print ("Hello World\n");
08: //glib를 사용한답시고 g_print 를 사용하던데 printf를 써도 별문제가 없더라.
09: }
10:
11: gboolean Fdelete_event( GtkWidget *widget, GdkEvent *event, gpointer data )
12: {
13: g_print ("delete event\n");
14: return FALSE; // 만약 TRUE를 해주면 창 오른쪽 상단의 X를 눌러도 창이 닫히지 않게된다.
15: }
16:
17: static void Fdestroy( GtkWidget *widget, gpointer data )
18: {
19: g_print ("destroy\n");
20: gtk_main_quit (); // GTK를 완전히 끝낸다 이함수를 써주지 않는다면 창이 종료되어도
21: // 프로세스는 계속 실행중이게 된다.
22: // [root@localhost ~]# 이걸로 복귀하지 않는다는 말이다.
23:
24: }
25:
26: int main( int argc, char *argv[] )
27: {
28: GtkWidget *window; // 윈도우를 담을 위젯을 만들고
29: GtkWidget *button; // 버튼을 담을 위젯을 하나 만들었다.
30:
31: gtk_init (&argc, &argv); // GTK를 사용하기위한 초기설정을 담당해준다
32:
33: window = gtk_window_new (GTK_WINDOW_TOPLEVEL); // 창을 만들어준다.
34:
35: g_signal_connect (G_OBJECT (window), "delete_event", G_CALLBACK (Fdelete_event), NULL);
36: // delete_event 를 받으면 Fdelete_event() 를 호출해 주도록 한다.
37:
38: g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (Fdestroy), NULL);
39: // destroy 를 받으면 Fdestroy() 를 호출해 주도록 한다.
40:
41: gtk_container_set_border_width (GTK_CONTAINER (window), 10);
42: // 윈도우의 여백을 10으로 지정한다.
43:
44: button = gtk_button_new_with_label ("Hellow orld");
45: // Hellow orld 라벨을 가지고 버튼을 하나 만든다
46:
47: g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (Fhello), NULL);
48: // button이 clicked 되면 Fhello() 함수를 호출해주도록 한다.
49:
50: /* g_signal_connect_swapped (G_OBJECT (button), "clicked",
51: G_CALLBACK (gtk_widget_destroy),
52: G_OBJECT (window)); */
53: // 위 함수는 button이 clicked 되면 window에 gtk_widget_destroy를 전달한다.
54: // 한말로 버튼이 눌려지면 윈도우를 종료시키는 루틴을 실행한다.
55: // 본 여기서는 사용하지 않았다.
56:
57: gtk_container_add (GTK_CONTAINER (window), button); // window에 button을 더해준다(올려준다)
58:
59: gtk_widget_show (button); // 먼저 버튼을 보여준다.
60: gtk_widget_show (window); // 창을 보여준다.
61:
62: gtk_main (); // GTK 루프이다, 키를 누르던가 하는 이벤트를 감시해준다.
63:
64: return 0;
65: }


콘솔에서 ./helloworld 를 쳐서 실행하면
버튼을 누를때마다 g_print ("Hello World\n"); 가 동작하는 모습을 볼수있다.
종료시에도 delete_event 와 destroy 를 볼수있다.
X윈도에서 더블클릭해서는 볼수 없다.

[GTK] 1. 스타트, 빈창 만들기

01: #include <gtk/gtk.h>
02:
03: int main( int argc, char *argv[] ) // 기본의 main문
04: {
05: GtkWidget *window; //여기서 위젯을 하나 만들어준다.
06:
07: gtk_init (&argc, &argv); //GTK 초기화를 해준다
08:
09: window = gtk_window_new (GTK_WINDOW_TOPLEVEL); // 위젯에 새 윈도우라고 정의해준다
10: // GTK_WINDOW_TOPLEVEL은 200*200사이즈의
11: // 자식없는 윈도우를 만들라 이거다.
12:
13: gtk_widget_show (window); // 작업이 끝난 window를 보여준다
14:
15: gtk_main (); // GTK 이벤트를 처리하기 위한 루프메인이다.
16:
17: return 0;
18: }


중요한 컴파일 방법은 // 물론 리눅스 쉘상에서;
gcc base.c -o base `pkg-config --cflags --libs gtk+-2.0`
간단히 분석하면
base.c를 컴파일하는데
-o 아웃파일로 base 를 만들어라,
` 이것은 엔터옆의 ' 이게 아니라 탭 위에있는 ` / ~ 이걸 눌러줘야한다.
나머지는 모르겠다.

[GTK] GTK 입문

컴파일 방법

gcc 소스파일 -o 실행파일 `pkg-config –cflags –libs gtk+-2.0`

~/.vimrc or ~/.gvimrc 파일에 다음 아랫줄을 넣어주면 vim에서 F10키루 컴파일이 가능함

map :w!:!clear;gcc % -o %< `pkg-config –cflags –libs gtk+-2.0` && ./%<

GTK+ 2.0 영문 튜토리얼

한글 ( 버젼은 확실히 모르겠다만 2.0은 아닌듯)
http://kldp.org/KoreanDoc/html/GtkTutorial/GtkTutorial.html