如何在qtHaskell中使用`itemDoubleClicked(QTreeWidgetItem *,int)`信号

时间:2010-06-07 16:50:00

标签: qt haskell qt4

我想在 Haskell 程序中使用itemDoubleClicked(QTreeWidgetItem*,int)信号,我正在编写用于GUI的 qtHaskell 。要连接我在其他地方执行的功能,请执行以下操作:

dummyWidget <- myQWidget
connectSlot object signal dummyWidget "customSlot()" $ f

其中objectQWidgetsignal是表示信号的字符串,例如"triggered()"f是我希望在发送信号时调用的函数。 API中connectSlot的定义是:

class Qcs x where
  connectSlot :: QObject a -> String -> QObject b -> String -> x -> IO ()

Qcs的实例是:

Qcs ()  
Qcs (QObject c -> String -> IO ())  
Qcs (QObject c -> Object d -> IO ())  
Qcs (QObject c -> Bool -> IO ())  
Qcs (QObject c -> Int -> IO ())  
Qcs (QObject c -> IO ())  
Qcs (QObject c -> OpenGLVersionFlag -> IO ())

第一个传递的参数应该是我正在使用信号的QObject。如您所见,没有实例f,连接信号的函数,可以有两个进一步的参数来接收QWidget和信号发送的整数。有没有办法将该信号连接到自定义函数?

1 个答案:

答案 0 :(得分:1)

注意:我将此答案仅作为文档提交。我的建议是基于一种误解,在这种情况下实际上并不起作用。


使用部分应用的自定义函数调用connectSlot是否有效,如"Signals and Slots"中的qtHaskell primer示例?

在该示例中,函数on_hello_clicked的类型为QMessageBox () -> MyQPushButton -> IO (),这似乎与您希望f的外观相对应,但您需要额外的Int最后的论点。

作者将此功能与connectSlot一起使用,首先将其应用于他们的消息框:

hello <- myQPushButton "Hello qtHaskell World"
resize hello (200::Int, 60::Int)
mb <- qMessageBox hello 
connectSlot hello "clicked()" hello "click()" $ on_hello_clicked mb

因此虽然on_hello_clicked的类型不是Qcs的实例(因为它同时需要消息框和按钮),但部分应用的on_hello_clicked mb会这样做。