【问题标题】:With Haskell and Gtk2hs, how would I create a new widget and associated events?使用 Haskell 和 Gtk2hs,我将如何创建新的小部件和相关事件?
【发布时间】:2012-09-20 17:56:13
【问题描述】:

我有一个正在开发的应用程序,我基本上是在自学 GUI 编程。我在programmers.stackexchange上问了一个相当involved question。这个问题是关于我没有尝试过的想法的机制。

我有三个小部件:TreeView、TextField 和 DrawingArea。这三个小部件中的每一个都与一个上的事件非常密切地交互,必然触发另一个上的动作。这三个小部件在很大程度上不通过读取包含全局应用程序状态的 MVar 与应用程序的其余部分进行交互除了(到目前为止)。

目前,我认为大型应用程序不应该直接与这三个小部件中的任何一个进行交互。此外,将复制相同的模式以查看具有相同形式的其他数据。所以,在我看来,将这三个小部件实际绑定在一起成为一个更大的复合小部件,可以与 GTK 的正常事件队列交互是有意义的。所以,例如

type MyDataViewWidget = (TreeView, TextField, DrawingArea)
data DataUpdatedSignal a = DataUpdatedSignal a
data RedrawEvent a = RedrawEvent a

因此,小部件将使用 DataUpdatedEvent 向应用程序的其余部分指示 MyDataViewWidget 内部的某些内容发生了变化,而 RedrawEvent 将告诉小部件它需要重绘或重新读取源数据。

(从技术上讲,我没有从语义上考虑过复合小部件中的各种操作会做什么......小部件是否只有应用程序数据的只读副本并且需要接收新的只读副本RedrawEvent 或者小部件可能具有 MVar 本身并被允许更改 MVar 中的数据等...我现在只是对如何实际执行此操作感兴趣)

有没有这样做的例子?基本上,我需要实现哪些实例来创建新的小部件和两个信号?我更愿意坚持使用 Haskell,但我可以使用 C 来构建新的小部件。

【问题讨论】:

    标签: haskell gtk2hs


    【解决方案1】:

    不幸的是,目前没有纯 Haskell 方法来(正确)实现 Widget 类型类。您需要在 C 中实现您的小部件,然后通过 FFI 导入它。有很多这样的例子——基本上所有的 gtk+/gtk2hs 都是数百个这样做的例子的集合。

    【讨论】:

    • 很公平。这可能真的很重要,但听起来我的过程是 1)编写一个实现此接口的新库,2)编写一个 C 应用程序来测试它,一旦成功 3)编写 FFI 将其集成到我的 Haskell应用程序。我可能不会立即这样做,但听起来确实很有趣。
    • @Daniel 下一个实现不正确吗? hpaste.org/74985(它创建了GObject 子类,但我认为Widget 也是可能的)任何关于stackoverflow.com/questions/12509431/… 的cmets 都会很有用。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-08
    • 2014-06-09
    相关资源
    最近更新 更多