나는 웹상에서 ClojureREPL을 Qt와 함께 사용하는 해결책을 찾지 못했습니다. 기본적으로 UI를 표시하기 위해 QApplication/exec를 호출하자마자 REPL이 멈추는 문제가 있습니다. REPL로 C-c C-c를 되돌릴 수는 없으며, 활성 Qt 윈도우를 닫으면 Clojure 프로세스 전체가 종료됩니다.Qt Jambi와 함께 Clojure REPL을 어떻게 사용할 수 있습니까?
이제 에이전트가 Qt 위젯을 만든 동일한 스레드에서 실행되지 않는 한 에이전트 내에서 QApplication/processEvents를 호출하는 것은 불가능합니다. 이 문제를 파악하는 데 2 일이 걸렸지 만 다른 사람들도 동일한 문제/문제가 있지만 해결책이없는 것을 보았습니다. 그래서 여기에 코드에서 내 꺼야 :
(add-classpath "file:///usr/share/java/qtjambi.jar")
(ns qt4-demo
(:import (com.trolltech.qt.gui QApplication QPushButton QFont QFont$Weight)
(com.trolltech.qt.core QCoreApplication)
(java.util Timer TimerTask)
(java.util.concurrent ScheduledThreadPoolExecutor TimeUnit))
(:require swank.core))
(defn init []
(QApplication/initialize (make-array String 0)))
(def *gui-thread* (new java.util.concurrent.ScheduledThreadPoolExecutor 1))
(def *gui-update-task* nil)
(def *app* (ref nil))
(defn update-gui []
(println "Updating GUI")
(QApplication/processEvents))
(defn exec []
(.remove *gui-thread* update-gui)
(def *gui-update-task* (.scheduleAtFixedRate *gui-thread* update-gui 0 150 (. TimeUnit MILLISECONDS))))
(defn stop []
(.remove *gui-thread* update-gui)
(.cancel *gui-update-task*))
(defmacro qt4 [& rest]
`(do
(try (init) (catch RuntimeException e# (println e#)))
[email protected]
))
(defmacro with-gui-thread [& body]
`(.get (.schedule *gui-thread* (fn [] (do [email protected])) (long 0) (. TimeUnit MILLISECONDS))))
(defn hello-world []
(with-gui-thread
(qt4
(let [app (QCoreApplication/instance)
button (new QPushButton "Go Clojure Go")]
(dosync (ref-set *app* app))
(doto button
(.resize 250 100)
(.setFont (new QFont "Deja Vu Sans" 18 (.. QFont$Weight Bold value)))
(.setWindowTitle "Go Clojure Go")
(.show)))))
(exec))
는 기본적으로 모든 Qt는 코드를 실행하기 위해 스케줄 할 클래스를 사용합니다. with-gui-thread 매크로를 사용하면 스레드 내에서 함수를보다 쉽게 호출 할 수 있습니다. 다시 컴파일하지 않고도 Qt UI를 즉석에서 변경할 수 있습니다.
그래도 나는 똑같은 것을해야했다. – levand
나는 QT에 대해 아무것도 모른다. 그런데 왜 이걸하고 싶니? Clojure는 매우 강력하고 다양한 GUI 프레임 워크 인 Swing에 액세스 할 수 있습니다. 이미 설치되어있는 QT GUI에 연결하고 있습니까? –
QT는 퍼포먼스와 네이티브 룩앤필을 포함한 많은면에서 Swing보다 뛰어나다. – levand