Решение позволить Apache 2 размещать веб-сайты за пределами htdocs:
Нижняя часть директива "DocumentRoot" в httpd.conf, необходимо видеть блок каталога. Замените этот блок каталога:
<Directory />
Options FollowSymLinks
AllowOverride All
Allow from all
</Directory>
НЕ ЗАБЫВАЮТ НЕ ИСПОЛЬЗОВАТЬ ЭТУ КОНФИГУРАЦИЮ В РЕАЛЬНОЙ СРЕДЕ
Если вы хотите возиться с виджетами Qt из REPL, возможно, вам нужно QApplication / invokeLater
или QApplication / invokeAndWait
. Вы можете использовать их вместе с агентами. Учитывая это:
(ns qt4-demo
(:import (com.trolltech.qt.gui QApplication QPushButton)
(com.trolltech.qt.core QCoreApplication)))
(def *app* (ref nil))
(def *button* (ref nil))
(def *runner* (agent nil))
(defn init [] (QApplication/initialize (make-array String 0)))
(defn exec [] (QApplication/exec))
(defn hello-world [a]
(init)
(let [app (QCoreApplication/instance)
button (doto (QPushButton. "Go Clojure Go") (.show))]
(dosync (ref-set *app* app)
(ref-set *button* button)))
(exec))
Затем из REPL:
qt4-demo=> (send-off *runner* hello-world)
#<Agent@38fff7: nil>
;; This fails because we are not in the Qt main thread
qt4-demo=> (.setText @*button* "foo")
QObject used from outside its own thread, object=QPushButton(0x8d0f55f0) , objectThread=Thread[pool-2-thread-1,5,main], currentThread=Thread[main,5,main] (NO_SOURCE_FILE:0)
;; This should work though
qt4-demo=> (QApplication/invokeLater #(.setText @*button* "foo"))
nil
qt4-demo=> (QApplication/invokeAndWait #(.setText @*button* "bar"))
nil
I ' О том, как это сделать с помощью SLIME , я писал в моем блоге (немецкий), а также в списке рассылки Clojure . Уловка состоит в том, чтобы определить соответствующие функции на стороне Emacs и указать SLIME использовать их при выполнении запросов. Важно отметить, что это освобождает вас от необходимости выполнять специальные заклинания при вызове кода Qt.
Цитирую себя:
Учитывая, что мы говорим здесь о Лиспе, в любом случае решение казалось очевидно: взломайте SLIME! Так вот что я сделал. Код ниже при сбросе в ваш .emacs (в момент, когда SLIME уже полностью загружен), регистрирует три новых Emacs-Lisp функции для интерактивного использования. Вы может привязать их к любым клавишам, которые вы нравится, или вы можете просто установить Slime-send-through-qapplication переменная t после вашего приложения началось и не беспокойтесь о ключе привязки вообще. Либо должен сделать ваши представления REPL и стиль CMx интерактивные оценки косвенные через QCoreApplication / invokeAndWait.
Удачи!
(defvar slime-send-through-qapplication nil)
(defvar slime-repl-send-string-fn (symbol-function 'slime-repl-send-
string))
(defvar slime-interactive-eval-fn (symbol-function 'slime-interactive-
eval))
(defun qt-appify-form (form)
(concatenate 'string ;'
"(let [return-ref (ref nil)] "
" (com.trolltech.qt.core.QCoreApplication/invokeAndWait "
" (fn [] "
" (let [return-value (do "
form
" )] "
" (dosync (ref-set return-ref return-value))))) "
" (deref return-ref))"))
(defun slime-interactive-eval (string)
(let ((string (if slime-send-through-qapplication
(qt-appify-form string)
string)))
(funcall slime-interactive-eval-fn string)))
(defun slime-repl-send-string (string &optional command-string)
(let ((string (if slime-send-through-qapplication
(qt-appify-form string)
string)))
(funcall slime-repl-send-string-fn string command-string)))
(defun slime-eval-defun-for-qt ()
(interactive)
(let ((slime-send-through-qapplication t))
(slime-eval-defun)))
(defun slime-repl-closing-return-for-qt ()
(interactive)
(let ((slime-send-through-qapplication t))
(slime-repl-closing-return)))
(defun slime-repl-return-for-qt (&optional end-of-input)
(interactive)
(let ((slime-send-through-qapplication t))
(slime-repl-return end-of-input)))