Как использовать сигнал `itemDoubleClicked (QTreeWidgetItem *, int)` в qtHaskell - PullRequest
7 голосов
/ 07 июня 2010

Я хочу использовать сигнал itemDoubleClicked(QTreeWidgetItem*,int) в программе Haskell , которую я пишу, где я использую qtHaskell для GUI. Для подключения функции у меня в других местах сделано следующее:

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

Где object - это некоторое QWidget, а signal - строка, представляющая сигнал, например, "triggered()" и f - это функция, которую я хочу вызывать при отправке сигнала. Определение connectSlot в API:

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 Ответ

1 голос
/ 14 июня 2010

ПРИМЕЧАНИЕ: Я оставляю этот ответ здесь только в качестве документации. Мое предложение было основано на недоразумении и фактически не работает в этой ситуации.


Будет ли работать вызов connectSlot с частично примененной пользовательской функцией, как в "Сигналы и слоты" в примере qtHaskell ?

В этом примере функция 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 имеет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...