スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

[Haskell]Qtのウィンドウを出してみる

とりあえずQtのウィンドウを出して、ボタンをクリックしたときにHaskellから渡した関数を呼び出すところまでやってみたのでメモしておきます。

Mac OSX 10.6.5
GHC 7.0.1
Qt 4.7.1

-- Main.hs
{-# LANGUAGE ForeignFunctionInterface #-}

module Main where

import System.Environment
import Foreign.C.Types
import Foreign.C.String
import Foreign.Ptr
import Foreign.Marshal.Array

main = do
(argc, argv) <- getArgs >>= makeCArgs
funptr <- makeFunPtr (putStrLn "Haskell function")
qtExample argc argv funptr

makeCArgs :: [String] -> IO (CInt, Ptr CString)
makeCArgs args =
mapM (newArray . (map castCharToCChar)) args
>>= newArray
>>= \argv -> return ((fromIntegral . length) args, argv)

foreign import ccall "wrapper" makeFunPtr :: IO () -> IO (FunPtr (IO ()))
foreign import ccall "qt_example" qtExample
:: CInt -> Ptr (Ptr CChar) -> FunPtr (IO ()) -> IO ()


/* example.cpp */
#include <QtGui>
#include "SlotProxy.h"

extern "C" {

void qt_example(int argc, char *argv[], void (*slot)())
{
QApplication *app = new QApplication(argc, argv);

QWidget *window = new QWidget();
window->resize(300, 150);

QPushButton* button = new QPushButton("Button", window);
button->setGeometry(100,50,100,50);

QObject::connect(button, SIGNAL(clicked()), new SlotProxy(button, slot), SLOT(run()));

window->show();
app->exec();

delete window;
delete app;
}

}


/* SlotProxy.h */
#ifndef __SlotProxy
#define __SlotProxy

#include <QtGui>

class SlotProxy : public QObject
{
Q_OBJECT

public:
SlotProxy(QObject* parent, void (*slot)());
~SlotProxy();
public slots:
void run();
private:
void (*slot)();
};

#endif


/* SlotProxy.cpp */
#include "SlotProxy.h"
#include <stdio.h>

SlotProxy::SlotProxy(QObject* parent, void (*slot)()) : QObject(parent){
this->slot = slot;
}
SlotProxy::~SlotProxy(){
printf("SlotProxy::~SlotProxy\n");
}
void SlotProxy::run(){
this->slot();
}


ビルド。

moc SlotProxy.h -o moc_SlotProxy.cpp
ghc --make Main.hs example.cpp SlotProxy.cpp moc_SlotProxy.cpp -lstdc++ -framework QtCore -framework QtGui -I/Library/Frameworks/QtGui.framework/Headers

mocは、SIGNALやSLOTを利用できるようQ_OBJECTマクロを持つクラスを拡張してくれるそうです。

コメントの投稿

非公開コメント

プロフィール

jou4

Author:jou4
FC2ブログへようこそ!

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QRコード
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。