2011-08-02 2 views
3

3 개의 입력 위젯과 하나의 버튼이있는 창이 있습니다. 버튼을 사용하여 위젯 중 하나를 프로그래밍 방식으로 제거합니다. 문제는 주 윈도우가 제거 된 후에 새 레이아웃에 맞게 크기가 변경되지 않는다는 것입니다.gtk2hs : 위젯을 제거한 후 창 크기 재 계산을 요청하십시오.

신호 나 이벤트를 주 루프에 보내야 재 계산이 발생할 수 있지만 이러한 기능을 찾을 수 없었을 것입니다. ,

refresh window = do 
    Requisition w h <- widgetSizeRequest window 
    windowResize window w h 

이를 사용하려면 : 당신이되고 싶어 얼마나 큰 최상위 창을 요청하고, 큰 것을 할 수

import Graphics.UI.Gtk 
import Data.IORef 
import qualified Graphics.UI.Gtk as G hiding (Point) 
import qualified Graphics.UI.Gtk.Gdk.EventM as E 
import qualified Graphics.UI.Gtk.Abstract.Widget as W 
import qualified Graphics.Rendering.Cairo as C 


makeEntry :: String -> IO Entry 
makeEntry str = do e <- entryNew 
        entrySetText e str 
        return e 

main :: IO() 
main = do 
    initGUI 
    window <- windowNew 
    box <- vBoxNew False 0 
    G.on window G.keyPressEvent $ E.tryEvent $ do 
    "Escape" <- E.eventKeyName 
    C.liftIO $ G.widgetDestroy window 

    set window [ containerChild := box ] 

    e1 <- makeEntry "e1" 
    boxPackStart box e1 PackNatural 0 

    e2 <- makeEntry "e2" 
    boxPackStart box e2 PackNatural 0 

    e3 <- makeEntry "e3" 
    boxPackStart box e3 PackNatural 0 

    button <- buttonNew 
    set button [ buttonLabel := "Remove" ] 
    boxPackStart box button PackNatural 0 

    onClicked button (containerRemove box e2) 
    onDestroy window mainQuit 
    widgetShowAll window 
    mainGUI 

답변

3

:

는 여기에 몇 가지 예제 코드입니다 버튼의 클릭 핸들러에 붙여 넣으십시오.

onClicked button (containerRemove box e2 >> refresh window) 
+0

감사합니다. 작동합니다. –