2011-02-01 65 views
3

我一直在創建一個下拉式GTK日曆小部件在我的一個應用程序的麻煩。GTK下拉日曆小部件?

目標:

基本上我想有一個文本組合框,您可以在日期,如2011年2月1日例如鍵入,它會自動套用格式的日期。這部分不是問題,另一部分是下拉日曆方面,您可以單擊組合框旁邊的下拉按鈕,然後下拉到可以選擇日期的日曆中。

問題/半的解決方案:

我花了一些工作,在這個用Ruby GTK(真的侏儒綁定)黑客和下面是一些我已經想出瞭解決方案的。

  1. 基本上我創建了一個文本框,然後創建一個按鈕,並給了它「向下箭頭」來模擬組合框下拉按鈕,它看起來還好,不是最偉大的事情在世界上。

  2. 對於實際的日曆小部件,我會創建一個無邊界/無標題的對話框,並在其中嵌入日曆小部件,並將其置於文本框的下拉組合框列表出現的位置。

  3. 當用戶選擇一個日期時它將被解僱。

但是有幾個問題與上述解決方案,我已經與想出是:

  1. 無國界/ titleless對話框仍然創建了被在任務欄上顯示的東西。 ..

  2. 如果用戶按下「ctrl + q」來退出應用程序,由於日曆小部件具有焦點,所以鍵綁定永遠不會將其發送到父窗口。

  3. 如果我移動父窗口,日曆小部件卡在那裏漂浮在空中。

  4. 如果我點擊其他地方或鍵入日期到文本框,日曆Widget沒有消失,我要挑從日曆窗口小部件的日期......

因此,在短期我會像一些建議或建議如何做一個適當的/更好的方式做一個日曆下拉部件?我寧願保持這純粹在GTK沒有像Gnome等額外的小部件...

+0

如果對話框沒有父窗口,可能會出現問題1。不確定關於ruby,但在C++中,對話框的構造函數接受父窗口作爲參數。當我傳遞此參數時,對話框不會顯示在任務欄中。 – 2011-02-01 18:24:29

+0

我還不得不做一個日曆小部件,並有2-4所有問題。我終於通過添加Accept和Cancel按鈕來解決2和4問題。至少它明確地向用戶顯示了關閉日曆的方式。沒有真正有時間去處理問題3.我想可以從父窗口捕捉一些運動事件並相應地移動日曆(使用「motion-notify-event」或許有人糾正我)。恐怕這就是我可以提供的所有建議。 – 2011-02-01 18:41:43

回答

2

組合框的下拉菜單需要GtkListStore。您可以實現自定義GtkCellRenderer,在其單元格中將日期顯示爲GtkCalendar,然後在列表中存儲一個項目(日期)。當你下拉組合框時,日曆會出現,用戶可以選擇一個日期,然後你可以從你的列表存儲中讀取日期。