Tôi chưa tìm thấy giải pháp để sử dụng ClojureREPL với Qt trên web. Về cơ bản, vấn đề là REPL bị treo ngay sau khi bạn gọi QApplication/exec để hiển thị giao diện người dùng. Bạn không thể C-c C-c trở lại REPL, và đóng cửa sổ Qt đang hoạt động có vẻ như giết toàn bộ quá trình Clojure.Tôi có thể sử dụng Clojure REPL cùng với Qt Jambi bằng cách nào?
Bây giờ chỉ cần gọi QApplication/processEvents từ bên trong một tác nhân là không thể, trừ khi tác nhân chạy chính xác cùng một chuỗi mà bạn đã tạo các tiện ích Qt của mình. Tôi mất hai ngày để tìm ra điều này và tôi đã thấy những người khác có cùng vấn đề/vấn đề nhưng không có giải pháp. Vì vậy, đây là của tôi, trong mã:
(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))
Về cơ bản nó sử dụng lớp ScheduledThreadPoolExecutor để thực hiện tất cả Qt-mã. Bạn có thể sử dụng macro có gui-thread để dễ dàng gọi các hàm từ bên trong chuỗi. Điều này giúp bạn có thể thay đổi giao diện người dùng Qt khi đang di chuyển mà không cần biên dịch lại.
Vâng, tôi phải làm tương tự. – levand
Tôi không biết gì về QT. Nhưng tại sao bạn muốn làm điều này? Clojure có quyền truy cập vào Swing, một khung công tác GUI rất mạnh mẽ và linh hoạt. Bạn đang kết nối với một GUI QT đã có sẵn? –
QT được cho là tốt hơn Swing theo nhiều cách, bao gồm hiệu suất và giao diện bản địa. – levand