मुझे वेब पर Qt के साथ ClojureREPL का उपयोग करने का समाधान नहीं मिला है। असल में समस्या यह है कि यूआई को प्रदर्शित करने के लिए आरईपीएल जैसे ही आप QApplication/exec को कॉल करते हैं। आप सीईपी सी-सी को आरईपीएल में वापस नहीं कर सकते हैं, और सक्रिय क्यूटी विंडो को बंद करना पूरी क्लोजर प्रक्रिया को मारने लगता है।मैं क्यूटी जंबी के साथ क्लोजर आरईपीएल का उपयोग कैसे कर सकता हूं?
अब एजेंट के भीतर से QAplication/processEvents को कॉल करना संभव नहीं है, जब तक कि एजेंट बिल्कुल उसी थ्रेड में नहीं चलता है जिसमें आपने अपना क्यूटी विजेट बनाया है। इसे समझने में मुझे दो दिन लग गए और मैंने देखा है कि दूसरों के पास एक ही समस्या/समस्या है लेकिन समाधान के बिना। तो यहाँ मेरा है, कोड में:
(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))
मूल रूप से यह आदेश सभी क्यूटी-कोड को निष्पादित करने में ScheduledThreadPoolExecutor वर्ग का उपयोग करता है। थ्रेड के भीतर से फ़ंक्शंस कॉल करना आसान बनाने के लिए आप साथ-gui-thread मैक्रो का उपयोग कर सकते हैं। इससे क्यूटी यूआई ऑन-द-फ्लाई को बिना किसी संकल्प के बदलना संभव हो जाता है।
हाँ, मुझे वही करना था। – levand
मुझे क्यूटी के बारे में कुछ भी पता नहीं है। लेकिन आप ऐसा क्यों करना चाहते हैं? क्लोजर के पास स्विंग तक पहुंच है, जो एक बहुत ही शक्तिशाली और बहुमुखी जीयूआई ढांचा है। क्या आप एक क्यूटी जीयूआई से जुड़ रहे हैं जो पहले से ही मौजूद है? –
क्यूटी प्रदर्शन और देशी दिखने और महसूस सहित कई तरीकों से स्विंग से तर्कसंगत रूप से बेहतर है। – levand