2011-02-01 80 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,然后在列表中存储一个项目(日期)。当你下拉组合框时,日历会出现,用户可以选择一个日期,然后你可以从你的列表存储中读取日期。