[완료] gtk, gtkmm 에서 Gtk::Entry 에서 validate 하는 동일한 내용같은데 왜 차이점이 생길까요?
글쓴이: emptynote / 작성시간: 목, 2011/01/27 - 12:19오전
제가 2개 소스를 찾았습니다.
첫번째는 c++언어 Gtkmm
참고 url : http://www.mail-archive.com/gtkmm-list@gnome.org/msg06725.html
두번째는 c언어, Gtk
참고 url : http://library.gnome.org/devel/gtk-faq/stable/x842.html
문제가 되는것이 첫번째입니다.
실행해 보면
첫글자로 'a' 글자 한자 입력하면 화면에 'aA'라고 보여집니다.
대문자로 변경하는 A만 찍혀야 하는데 입력한 'a'까정 찍히네요.
반면에 C로 작성된 Gtk 예제에서는 화면에 A자만 찍히는것을 확인했습니다.
제가 원하는것은 C로 작성된 Gtk 예제처럼 동작하는 핸들러 함수입니다.
숫자, 영문 제약등등을 하기위해서입니다.
그런데 여기서 궁굼한것이 동일한 내용같은데
왜 이런 차이를 보이는지 도저히 몰라서 질문드립니다.
--------- Gtkmm validate 소스 ---------
#include <gtkmm.h> #include <iostream> class AlphaUpperEntry : public Gtk::Entry { public: AlphaUpperEntry(); protected: virtual void insert_text_handler(Glib::ustring const& text,int* position); sigc::connection insert_text_connection; }; AlphaUpperEntry::AlphaUpperEntry() { insert_text_connection = signal_insert_text().connect( sigc::mem_fun(*this, &AlphaUpperEntry::insert_text_handler) ); } void AlphaUpperEntry::insert_text_handler(Glib::ustring const& text, int* position) { // 제가 넣은 디버그 코드 Glib::ustring oldstr = get_text(); std::cout << "old str=[" << oldstr << "]" << std::endl; std::cout << "new str=[" << text << "]" << std::endl; Glib::ustring result; result.reserve(text.size()); for ( Glib::ustring::const_iterator it = text.begin(); it != text.end(); it++ ) { if ( Glib::Unicode::isalpha(*it) ) { result += Glib::Unicode::toupper(*it); } } std::cout << "result=[" << result << "]" << std::endl; if ( ! result.empty() ) { insert_text_connection.block(); insert_text(result, result.size(), *position); insert_text_connection.unblock(); } signal_insert_text().emission_stop(); } int main(int argc, char* argv[]) { Gtk::Main kit(argc, argv); AlphaUpperEntry entry; Gtk::Window window; window.set_title("AlphaUpperEntry"); window.add(entry); window.show_all(); kit.run(window); return 0; }
-----------------------------
--------- Gtk validate 소스 ---------
#include <ctype.h> #include <gtk/gtk.h> #include <stdio.h> void insert_text_handler (GtkEntry *entry, const gchar *text, gint length, gint *position, gpointer data) { // 제가 넣은 디버그 코드 printf("old str=[%s]\n", gtk_entry_get_text(entry)); printf("new str=[%s]\n", text); GtkEditable *editable = GTK_EDITABLE(entry); int i, count=0; gchar *result = g_new (gchar, length); for (i=0; i < length; i++) { if (!isalpha(text[i])) continue; result[count++] = islower(text[i]) ? toupper(text[i]) : text[i]; } if (count > 0) { g_signal_handlers_block_by_func (G_OBJECT (editable), G_CALLBACK (insert_text_handler), data); gtk_editable_insert_text (editable, result, count, position); g_signal_handlers_unblock_by_func (G_OBJECT (editable), G_CALLBACK (insert_text_handler), data); } g_signal_stop_emission_by_name (G_OBJECT (editable), "insert_text"); g_free (result); } int main (int argc, char *argv[]) { GtkWidget *window; GtkWidget *entry; gtk_init (&argc, &argv); /* create a new window */ window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW (window), "GTK Entry"); g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (gtk_main_quit), NULL); entry = gtk_entry_new(); g_signal_connect(G_OBJECT(entry), "insert_text", G_CALLBACK(insert_text_handler), NULL); gtk_container_add(GTK_CONTAINER (window), entry); gtk_widget_show(entry); gtk_widget_show(window); gtk_main(); return(0); }
-------------------------------------------------------------
Forums:
아.... 해보고 싶은데...
Makefile 만드는것도 할줄 모르네요;;;; ㅠㅠ.....
----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
autoconf 어렵다면 netbeans 혹은 이클립스 c&c++ 버전 받아서 하면됩니다.
autoconf 어렵다면 netbeans 혹은 이클립스 c&c++ 버전 받아서 하면됩니다.
자바버전의 nebeans나 이클립스 받았다고 실망하시지 않으셔도 됩니다.
모두 c&c++ 할수있는 플러그인을 제공합니다. 이클립스는 그것을 CDT라고 부르네요.
물론 gtk 혹은 gtkmm을 사용하기 위해서는 외부 라이브러리 연결하기 위한 약간의 노가다가 필요합니다.
개인적으로 이클립스에서 작업하고 싶은데 코드 자동 완성 찾아보다 지쳐서 넷빈즈로 돌아섰습니다.
정말이지 자동완성 기능도 기능이지만
저같은 c & c++ 초보한테는 class 혹은 메소드의 설명을 보여주는것도 정말 요긴합니다.
그런데 간단한 예제의 경우 아래와 같은 shell?을 만들어 쓰고 있습니다.
저두 막 c&c++ 공부를 시작하는 입장이라
도움이 되기를 바라는 마음으로 적어 봅니다.
==> gtk_compile.sh 실행파일명 소스파일명
ex) gtk_compile.sh test test.c
~/gtk_sample$ cat gtk_compile.sh
gcc -o $1 $2 `pkg-config --cflags --libs gtk+-2.0`
~/gtk_sample$ cat gtkmm_compile.sh
g++ -o $1 $2 `pkg-config --cflags --libs gtkmm-2.4`
윈도우에서 컴파일 되네요.
헤더랑 라이브러리가 참;;;; 여러개 써야되네요.
sigc-2.0.lib gdkmm-2.4.lib gtkmm-2.4.lib gtk-win32-2.0.lib pangomm-1.4.lib pangowin32-1.0.lib glibmm-2.4.lib atkmm-1.6.lib cairomm-1.0.lib gtk-win32-2.0.lib gdk-win32-2.0.lib atk-1.0.lib gdk_pixbuf-2.0.lib pangowin32-1.0.lib pango-1.0.lib gobject-2.0.lib gmodule-2.0.lib glib-2.0.lib intl.lib iconv.lib
http://nberserk.tistory.com/56 여기에서 Glade for Windows서 Development Environment 이거 설치하고
http://kldp.org/node/99132 여기에서 gtkmm-win32-devel-2.12.7-3.exe 이거 설치하니까 됩니다.
하튼.
보니까 insert_text_handler()는 텍스트가 입력된 시점이라고 보이는데요.
a라고 입력한 텍스트가 이미 입력창에 넣어진 상태?라서
화면에 a라고 찍힌거고. 거기에 insert_text()로 A를 추가해서
aA라고 찍힌거같습니다.
입력창을 비우고 insert하거나. update하는 형식으로 변경하시면 될거같습니다.
아... 차이점을 물어보신건데요... ;;;; 그건 생각해보지 않았네요..
----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
답변감사합니다. 하지만 원하는 답은 아닌듯합니다.
답변감사합니다.
하지만 원하는 답은 아닌듯합니다.
그런데 제가 답을 찾은듯합니다.
connect(slot, bool after) 였네요.
명시적으로 값을 미지정하였기에 핸들러가 그후에 동작한거 맞네요.
아직 signal 처리에 어리 버리 하기때문에,
netbeans에서 함수 도움말 보여주지 않았으면 평생 못찾을뻔했네요.
<< 변경전 >> insert_text_connection = signal_insert_text().connect( sigc::mem_fun(*this, &AlphaUpperEntry::insert_text_handler) ); << 변경후>> insert_text_connection = signal_insert_text().connect( sigc::mem_fun(*this, &AlphaUpperEntry::insert_text_handler), false );
참고 url : http://library.gnome.org/devel/glibmm/unstable/classGlib_1_1SignalProxy2.html#a66b5747c9db52041b508bc889ff36fcb
------------ glibmm: Glib::SignalProxy2 인용 ---------------------------------
template
sigc::connection Glib::SignalProxy2< R, P1, P2 >::connect ( const SlotType & slot, bool after = true )
Connects a signal to a signal handler.
For instance, connect( sigc::mem_fun(*this, &TheClass::on_something) );
Parameters:
slot The signal handler, usually created with sigc::mem_fun(), or sigc::ptr_fun().
after Whether this signal handler should be called before or after the default signal handler.
------------
댓글 달기