사용자 도구

사이트 도구


sdk:gtk2

차이

문서의 선택한 두 판 사이의 차이를 보여줍니다.

차이 보기로 링크

양쪽 이전 판이전 판
sdk:gtk2 [2021/04/24 17:01] kieunssdk:gtk2 [2024/04/23 22:43] (현재) – 바깥 편집 127.0.0.1
줄 1: 줄 1:
 +<title>GTK2</title>
  
 +[[http://ruby-gnome2.sourceforge.jp/hiki.cgi?tut-gtk|GTK2 Tutorial Site]]에서 읽어 본 것을 정리하자
 +
 +필요한거 만들 정도만, 읽어볼 예정
 +
 +{{tag> gtk gtk2}}
 +
 +====== Hello World ======
 +
 +일단 윈도우를 띄우고 종료하는데 필요한 코드.
 +
 +<code ruby>
 +require 'gtk2'
 +
 +button = Gtk::Button.new("Hello World")
 +button.signal_connect("clicked") {
 +  puts "Hello World"
 +}
 +
 +#윈도우 생성, 간단하네.
 +window = Gtk::Window.new
 +window.signal_connect("delete_event") {
 + puts "delete event occurred"
 + false
 +}
 +
 +window.signal_connect("destroy") {
 + puts "destroy event occurred"
 + Gtk.main_quit
 +}
 +
 +window.border_width = 20
 +window.add(button)
 +# 윈도우를 보여준다, 끝.
 +window.show_all
 +# 이벤트 사이클 시작 (아마도)
 +Gtk.main
 +</code>
 +
 +====== Signal ======
 +
 +[[http://ruby-gnome2.sourceforge.jp/hiki.cgi?GLib%3A%3AInstantiatable#signal_connect|Ruby/GTK2의 시그널 함수 목록]] / [[http://ruby-gnome2.sourceforge.jp/hiki.cgi?tut-gtk-events|시그널 목록]]
 +
 +  * 나중에 정리해볼까나?
 +
 +리턴값에 의미가 있는데
 +  * true : 이벤트 실행을 이 함수에서 종료
 +  * false : 이벤트 실행을 계속 진행
 +하는 의미가 있다. 윈도우는 계속 실행 되는데 이런 점이 다르군.
 +
 +signal_connect
 +  * connect_signal()은 같은 시그널에 여러 개의 함수를 연결 할 수 있더라. 실행하면 연결된 순서대로 실행 된다.
 +
 +signal_emit
 +  * 파라미터로 입력된 시그널, 스트링형식의 이름,과 연결된 함수를 모두 호출한다.
 +
 +signal_handler_disconnect
 +  * 연결된 시그널을 모두 삭제한다.
 +
 +====== BasicWindow ======
 +
 +구지 클래스로 만들 필요는 없었지만, 코딩 연습하고 문법 익히는 김에 간단히 종료 버튼을 추가한 기능만을 작성
 +
 +<code ruby>
 +require 'gtk2'
 +
 +class BasicWindow < Gtk::Window
 + def initialize(title = nil)
 + # dont forget call super.initialize
 + super(Gtk::Window::TOPLEVEL)
 + signal_connect('delete_event') do
 + Gtk.main_quit
 + false
 + end
 + border_width=10
 + end
 +end
 +
 +mainWindow = BasicWindow.new
 +mainWindow.show_all
 +Gtk.main
 +</code>
 +
 +====== 위젯(widget) ======
 +
 +위젯은 new로 생성하고, 위젯의 옵션은 new의 파라미터로 입력한다. --> [[http://ruby-gnome2.sourceforge.jp/hiki.cgi?tut-gtk2-packing-intro|도움말]]을 참고
 +
 +
 +===== UI 작성 =====
 +
 +MSVC는 UI 편집기가 있어서 매우 간단하게 끝낼 수 있는데, 이건 머리 속으로 상상하면서 위젯을 하나씩 붙여가야했다. 앞으로도 계속 그래야 하는지 잘 모르겠는데... UI 편집툴이 있긴하던데, 좀 불편하다.
 +
 +간단한걸 만들고 싶으면 그냥 코딩하는게 나을지도 모르겠다.
 +
 +UI 작성시에는,
 +
 +Gtk::HBox나 Gtk::VBox로 먼저 위젯을 붙일 공간을 준비하고 이 박스에는 
 +<code ruby>
 +hbox.pack_start( widgetName, true, true, spacing )
 +</code>
 +이 함수로 위젯을 더 붙여간다. **위젯을 더 모양 좋게 붙이려면 다른 위젯을 더 붙여가야하는데** 아직은 뭘 붙여야 하는지 모르겠다.
 +
 +다음 코드를 찬찬히 읽어보는게 더 빠르다.
 +
 +<code ruby>
 +# +------------------------+
 +# | mainVbox               |
 +# |+-editFrame------------+|
 +# || entry                ||
 +# |+----------------------||
 +# |+-btnFrame-------------+|
 +# || btnBox + button      ||
 +# |+----------------------||
 +# +------------------------+
 +def prepareUISample
 + # 순서
 + # 1. 버티컬 박스를 생성하고 메인 윈도우에 추가
 + # 2. 에디트프레임(그룹핑박스) 생성하고, 버티컬박스에 추가
 + # 3. 엔트리(입력창)를 생성하고 에디트프레임에 추가
 + mainVbox = Gtk::VBox.new( false, 2 )
 + # 메인 윈도우에 추가하는 부분 (그렇다고 상상하면 됨)
 + add( mainVbox )
 + # 프레임을 생성하고 버티컬박스에 추가
 + editFrame = Gtk::Frame.new('enter sample value')
 + mainVbox.pack_start( editFrame, true, true, 10 )
 + # 엔트리(입력창)을 생성해서 에디트 프레임에 추가
 + entry1 = Gtk::Entry.new
 + editFrame.add( entry1 )
 +
 + # 이쪽의 순서
 + # 1. 버튼프레임생성(그룹핑박스)하고 버티컬박스에 추가, 위에서 생성한거 아래 부분에 추가됨
 + # 2. 버튼박스를 생성해서 버튼 프레임에 추가
 + btnFrame = Gtk::Frame.new('some choice')
 + mainVbox.pack_start(btnFrame, true, true, 5)
 + btnBox = Gtk::HButtonBox.new
 + btnBox.set_border_width(5)
 + btnBox.layout_style = Gtk::ButtonBox::EDGE
 + btnBox.set_spacing(40)
 + btnFrame.add( btnBox )
 +end
 +</code>
 +
 +===== Gtk::Box =====
 +
 +Gtk::Box#pack_start
 +
 +  * 위젯을 위 --> 아래 / 왼쪽 --> 오른쪽으로 붙여간다.
 +
 +Gtk::Box#pack_end
 +
 +  * 위젯을 아래 --> 위 / 오른쪽 --> 왼쪽으로 붙여간다. 
 +
 +[[http://ruby-gnome2.sourceforge.jp/hiki.cgi?tut-gtk2-packing-box-details|자세한설명(영문)]]
 +
 +===== Gtk 대화상자(dialog) 띄우기 =====
 +
 +<code ruby>
 +dialog = Gtk::MessageDialog.new(self,
 + Gtk::Dialog::MODAL | Gtk::Dialog::DESTROY_WITH_PARENT,
 + Gtk::MessageDialog::INFO,
 + Gtk::MessageDialog::BUTTONS_OK,
 + @tempText )
 +dialog.run
 +dialog.destroy
 +</code>