반응형

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. 이제 실행하면 다음처럼 창이 보입니다. 버튼을 클릭하면 간단히 동작합니다. 

 




반응형

문제 발생시 지나치지 마시고 댓글 남겨주시면 가능한 빨리 답장드립니다.

도움이 되셨다면 토스아이디로 후원해주세요.
https://toss.me/momo2024


제가 쓴 책도 한번 검토해보세요 ^^

+ Recent posts