Julia에서 Qt를 사용하는 방법을 다룹니다. 포스트에선 맥북에서 진행했지만 윈도우/리눅스에서도 거의 그대로 진행가능합니다.
2024. 2. 1 최초작성
1. command + space bar를 누른 후, code를 입력하여 보이는 Visual Studio Code를 클릭하여 실행합니다.
2. 다음 코드를 실행하여 QML.jl 패키지를 설치합니다.
using Pkg Pkg.add("QML") |
설치 직후 화면입니다.
3. 간단한 코드를 작성하여 테스트 해봅니다. 다음 두 개의 파일을 작성합니다.
qml / gui.qml
qml 폴더를 생성한 후, gui.qml 파일을 생성합니다.
import QtQuick import QtQuick.Controls import QtQuick.Layouts import org.julialang ApplicationWindow { title: "My Application" width: 480 height: 640 visible: true Connections { target: guiproperties.timer function onTimeout() { Julia.counter_slot(); } } ColumnLayout { spacing: 6 anchors.centerIn: parent Text { id: juliaHello Layout.alignment: Qt.AlignCenter text: Julia.hello() } Button { Layout.alignment: Qt.AlignCenter text: "Push Me" onClicked: { resultDisplay.text = Julia.increment_counter().toString(); } } Text { id: resultDisplay Layout.alignment: Qt.AlignCenter text: "Push button for result" } TextField { id: lowerIn Layout.alignment: Qt.AlignCenter Layout.minimumWidth: 300 placeholderText: qsTr("Start typing, Julia does the rest...") } Text { id: upperOut Layout.alignment: Qt.AlignCenter text: Julia.uppercase(lowerIn.text) } Text { Layout.alignment: Qt.AlignCenter text: "Concatenation, showing multiple arguments:" } Text { Layout.alignment: Qt.AlignCenter text: Julia.string(guiproperties.oldcounter, ", ", upperOut.text) } Button { Layout.alignment: Qt.AlignCenter text: "Start counting" onClicked: guiproperties.timer.start() } Text { Layout.alignment: Qt.AlignCenter text: guiproperties.bg_counter.toString() } Button { Layout.alignment: Qt.AlignCenter text: "Stop counting" onClicked: guiproperties.timer.stop() } } } |
gui.jl
using Test using QML using Observables hello() = "Hello from Julia" counter = 0 const oldcounter = Observable(0) function increment_counter() global counter, oldcounter oldcounter[] = counter counter += 1 end function counter_value() global counter return counter end const bg_counter = Observable(0) function counter_slot() global bg_counter bg_counter[] += 1 end # This slows down the bg_counter display. It counts a *lot* faster this way, proving the main overhead is in the GUI update and not in the callback mechanism to Julia const bg_counter_slow = Observable(0) on(bg_counter) do newcount if newcount % 100 == 0 bg_counter_slow[] = newcount end end @qmlfunction counter_slot hello increment_counter uppercase string # absolute path in case working dir is overridden qml_file = joinpath(dirname(@__FILE__), "qml", "gui.qml") # Load the QML file loadqml(qml_file, guiproperties = JuliaPropertyMap("timer" => QTimer(), "oldcounter" => oldcounter, "bg_counter" => bg_counter_slow)) # Run the application exec() println("Button was pressed $counter times") println("Background counter now at $(bg_counter[])") |
4. 다음처럼 파일이 저장된 상태가 되야 합니다.
5. 실행해보니 다음 에러가 나네요.
ERROR: LoadError: ArgumentError: Package Observables not found in current path.
- Run `import Pkg; Pkg.add("Observables")` to install the Observables package.
Stacktrace:
[1] macro expansion
@ Base ./loading.jl:1766 [inlined]
[2] macro expansion
@ Base ./lock.jl:267 [inlined]
[3] __require(into::Module, mod::Symbol)
@ Base ./loading.jl:1747
[4] #invoke_in_world#3
@ Base ./essentials.jl:921 [inlined]
[5] invoke_in_world
@ Base ./essentials.jl:918 [inlined]
[6] require(into::Module, mod::Symbol)
@ Base ./loading.jl:1740
in expression starting at /Users/webnautes/julia/gui.jl:3
로그에 보인 코드를 사용하여 추가 패키지를 설치해야 합니다.
using Pkg Pkg.add("Observables") |
6. 이제 실행하면 다음처럼 창이 보입니다. 버튼을 클릭하면 간단히 동작합니다.
'Julia > Julia 활용' 카테고리의 다른 글
OpenCV.jl - Julia에서 OpenCV로 webcam 영상 보기 (0) | 2023.11.27 |
---|---|
OpenCV.jl - Julia 에서 OpenCV 사용하기 (0) | 2023.11.20 |
시간날때마다 틈틈이 이것저것 해보며 블로그에 글을 남깁니다.
블로그의 문서는 종종 최신 버전으로 업데이트됩니다.
여유 시간이 날때 진행하는 거라 언제 진행될지는 알 수 없습니다.
영화,책, 생각등을 올리는 블로그도 운영하고 있습니다.
https://freewriting2024.tistory.com
제가 쓴 책도 한번 검토해보세요 ^^
그렇게 천천히 걸으면서도 그렇게 빨리 앞으로 나갈 수 있다는 건.
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!