2011-08-02 8 views
3

私は3つのエントリーウィジェットと1つのボタンを持つウィンドウを持っています。私はボタンを使用してウィジェットの1つをプログラム的に削除します。問題は、メインウィンドウが削除された後、新しいレイアウトに合わせてサイズが変更されないことです。gtk2hs:ウィジェットを削除した後のウィンドウサイズの再計算をリクエストします。

信号やイベントをメインループに送信する必要があると想像できますが、再計算の原因になりますが、そのような機能を見つけることができませんでした。ここで

は、いくつかのサンプルコードです:

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

あなたはそれがあることを望んでどのように大きなあなたのトップレベルウィンドウを尋ねると、それは大きなことを可能にすることができます。

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

はこれを使用するには、ボタンのクリックハンドラーに貼り付けてください。

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

ありがとうございます。 –

関連する問題