我想在 Haskell 程序中使用itemDoubleClicked(QTreeWidgetItem*,int)
信号,我正在编写用于GUI的 qtHaskell 。要连接我在其他地方执行的功能,请执行以下操作:
dummyWidget <- myQWidget
connectSlot object signal dummyWidget "customSlot()" $ f
其中object
是QWidget
,signal
是表示信号的字符串,例如"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
和信号发送的整数。有没有办法将该信号连接到自定义函数?
答案 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
会这样做。