Programming/golang2026. 8. 25. 11:11

sync  패키지

[링크 : https://pkg.go.dev/sync]

 

Mutex.Lock() 은 Mutex.Unlock()으로 풀수 있다.

[링크 : https://pkg.go.dev/sync#Mutex.Lock]

[링크 : https://pkg.go.dev/sync#Mutex]

 

RWMutex.RLock() / RWMutex.Lock() - RWMutex.RUnlock() / RWMutex.Unlock()

abc 순으로 정렬되어있다보니 보기가 어렵네

아무튼 Lock - Unlock / RLock - RUnlock 으로 pair가 된다.

func (rw *RWMutex) Lock()
Lock locks rw for writing. If the lock is already locked for reading or writing, Lock blocks until the lock is available.


func (*RWMutex) Unlock ¶
func (rw *RWMutex) Unlock()
Unlock unlocks rw for writing. It is a run-time error if rw is not locked for writing on entry to Unlock.

As with Mutexes, a locked RWMutex is not associated with a particular goroutine. One goroutine may RWMutex.RLock (RWMutex.Lock) a RWMutex and then arrange for another goroutine to RWMutex.RUnlock (RWMutex.Unlock) it.


func (*RWMutex) RLock ¶
func (rw *RWMutex) RLock()
RLock locks rw for reading.

It should not be used for recursive read locking; a blocked Lock call excludes new readers from acquiring the lock. See the documentation on the RWMutex type.


func (*RWMutex) RUnlock ¶
func (rw *RWMutex) RUnlock()
RUnlock undoes a single RWMutex.RLock call; it does not affect other simultaneous readers. It is a run-time error if rw is not locked for reading on entry to RUnlock.

[링크 : https://pkg.go.dev/sync#RWMutex.Lock]

[링크 : https://pkg.go.dev/sync#RWMutex]

 

[링크 : https://www.jaenung.net/tree/28536]

[링크 : https://rainbow96bear.tistory.com/entry/Go-고루틴-이해하기-뮤텍스-데드락]

 

+

2026.08.26

Usage¶
To help diagnose such bugs, Go includes a built-in data race detector. To use it, add the -race flag to the go command:

$ go test -race mypkg    // to test the package
$ go run -race mysrc.go  // to run the source file
$ go build -race mycmd   // to build the command
$ go install -race mypkg // to install the package

[링크 : https://go.dev/doc/articles/race_detector]

'Programming > golang' 카테고리의 다른 글

golang channel..2 방향, select 등  (0) 2026.08.25
golang Init()  (0) 2026.08.20
golang git commit hash  (0) 2025.11.24
golang 정적웹 파일 포함하기  (0) 2025.11.24
go vet (golang 정적분석)  (0) 2025.10.02
Posted by 구차니
Programming/golang2026. 8. 25. 10:55

기본적으로 채널은 양방향이고, 생성시에 방향을 지정할수 있다

ChannelType = ( "chan" | "chan" "<-" | "<-" "chan" ) ElementType .

chan T          // can be used to send and receive values of type T
chan<- float64  // can only be used to send float64s
<-chan int      // can only be used to receive ints

[링크 : https://go.dev/ref/spec#Channel_types]

[링크 : https://mynewcodings.tistory.com/313]

[링크 : https://jh-labs.tistory.com/716]

 

채널 브릿징

[링크 : https://kr.linkedin.com/pulse/mastering-go-concurrency-comprehensive-guide-channel-sourav-choudhary-0nwbc?tl=ko]

 

 

+

2026.08.26

ch chan<- string 이라는 건 chan<- string 타입의 ch 변수로 해석을 하면 되는데

$ cat ch.go
package main

import "fmt"

// sendOnly: ch1에는 보내기만 가능
func sender(ch string chan<-) {
ch <- "안녕하세요!"
}

// recvOnly: ch1에서 받기만 가능
func receiver(ch <-chan string) {
msg := <-ch
fmt.Println(msg)
}

func main() {
ch := make(chan string) // 생성할 때는 항상 양방향으로 만듦

go sender(ch)   // sender 함수 안에서는 송신만 가능하도록 타입이 제한됨
receiver(ch)    // receiver 함수 안에서는 수신만 가능하도록 타입이 제한됨
}

 

ch string chan<- 을 허용하나 바꾸고 빌드해보는데 에러가 난다. 칫.

$ go build ch.go
# command-line-arguments
./ch.go:6:23: syntax error: unexpected keyword chan in parameter list; possibly missing comma or )

 

+

의도적으로 go를 붙이지 않아 고루틴으로 하지 않고 받는 걸 먼서 생성하고

블럭킹 되어있어서 보내는걸 실행하지 못하게 하면

$ cat ch.go 
package main

import "fmt"

// sendOnly: ch1에는 보내기만 가능
func sender(ch chan<- string) {
ch <- "안녕하세요!"
}

// recvOnly: ch1에서 받기만 가능
func receiver(ch <-chan string) {
msg := <-ch
fmt.Println(msg)
}

func main() {
ch := make(chan string) // 생성할 때는 항상 양방향으로 만듦

receiver(ch) // receiver 함수 안에서는 수신만 가능하도록 타입이 제한됨
sender(ch)   // sender 함수 안에서는 송신만 가능하도록 타입이 제한됨
// go sender(ch) // 혹은 이렇게
}

 

빌드 시에는 아무런 에러나 경고가 없지만

실행시에는 deadlock이라고 띄우준다. 오.. 좋은데?

$ ./ch
fatal error: all goroutines are asleep - deadlock!

goroutine 1 [chan receive]:
main.receiver(0x2a1f3ecc6738?)
/home/falinux/work/src/go/ch.go:12 +0x1e
main.main()
/home/falinux/work/src/go/ch.go:19 +0x26

 

둘다 go 붙여서 돌리면 받는 쪽이 느린건지 이상하게(?) 아무런 메시지도 나오지 않는다. 머지?

func main() {
ch := make(chan string) // 생성할 때는 항상 양방향으로 만듦

go receiver(ch) // receiver 함수 안에서는 수신만 가능하도록 타입이 제한됨
go sender(ch)   // sender 함수 안에서는 송신만 가능하도록 타입이 제한됨
}

 

그래서  sleep 추가해도 안되네?

claude 말로는 둘다 go 루틴 실행하고 main()의 끝에 도달해서 종료되는 바람에 그렇다고 한다.

$ cat ch.go 
package main

import (
"fmt"
"time"
)

// sendOnly: ch1에는 보내기만 가능
func sender(ch chan<- string) {
time.Sleep(100)
ch <- "안녕하세요!"
}

// recvOnly: ch1에서 받기만 가능
func receiver(ch <-chan string) {
msg := <-ch
fmt.Println(msg)
}

func main() {
ch := make(chan string) // 생성할 때는 항상 양방향으로 만듦

go receiver(ch) // receiver 함수 안에서는 수신만 가능하도록 타입이 제한됨
go sender(ch)   // sender 함수 안에서는 송신만 가능하도록 타입이 제한됨
}

 

그래서 아래와 같이 main 함수를 늦게 종료하면 정상적으로 잘 나온다.

많이는 하지 않았는데 놓치지 않는걸 보면 

받는 쪽에서는 블로킹 되어있고, 채널 자체는 큐에 차있다가 뺴갈수 있을때 전달이 되는 듯.

func main() {
ch := make(chan string) // 생성할 때는 항상 양방향으로 만듦

go receiver(ch) // receiver 함수 안에서는 수신만 가능하도록 타입이 제한됨
go sender(ch)   // sender 함수 안에서는 송신만 가능하도록 타입이 제한됨

time.Sleep(1000 * time.Millisecond)
}

 

 

+

양방향 전달은 의외로(?) 별거 없다.

그냥 chan<- <-chan 에서 <- 지우고 선언후, 당연하게(?) 보내고 받으면 된다.

$ cat ch.go 
package main

import (
"fmt"
"time"
)

// sendOnly: ch1에는 보내기만 가능
func sender(ch chan string) {
ch <- "안녕하세요!"

msg := <-ch
fmt.Println(msg)
}

// recvOnly: ch1에서 받기만 가능
func receiver(ch chan string) {
msg := <-ch
fmt.Println(msg)

ch <- "느그아부지 모하시노!"
}

func main() {
ch := make(chan string) // 생성할 때는 항상 양방향으로 만듦

go sender(ch)   // sender 함수 안에서는 송신만 가능하도록 타입이 제한됨
go receiver(ch) // receiver 함수 안에서는 수신만 가능하도록 타입이 제한됨

time.Sleep(1000 * time.Millisecond)
}

 

$ ./ch
안녕하세요!
느그아부지 모하시노!

 

+

len() 함수로 현재 채널 버퍼의 크기를 확인할 수 있고

cap() 함수로 채널 버퍼의 최대 크기를 확인할 수 있다

$ cat ch_cap.go 
package main

import "fmt"

func main() {
ch := make(chan int, 5) // 버퍼 크기 5인 채널 생성

ch <- 1
ch <- 2
ch <- 3

fmt.Println("현재 버퍼에 쌓인 개수:", len(ch)) // 3
fmt.Println("버퍼 전체 용량:", cap(ch))       // 5
}

$ go run ch_cap.go
현재 버퍼에 쌓인 개수: 3
버퍼 전체 용량: 5

[링크 : https://mynewcodings.tistory.com/313]

 

그런데 이상하게도 채널 크기를 지정하지 않으면 에러가 발생한다

$ cat ch_cap.go 
package main

import "fmt"

func main() {
ch := make(chan int) // 버퍼 크기 5인 채널 생성

ch <- 1
ch <- 2
ch <- 3

fmt.Println("현재 버퍼에 쌓인 개수:", len(ch)) // 3
fmt.Println("버퍼 전체 용량:", cap(ch))       // 5
}

$ go run ch_cap.go
fatal error: all goroutines are asleep - deadlock!

goroutine 1 [chan send]:
main.main()
/home/falinux/work/src/go/ch_cap.go:8 +0x36
exit status 2

 

claude 답변으로는 capacity를 지정하지 않으면 길이가 0이고, 보내는데 받는 쪽이 없어서 deadlock 발생한다고 판단한다고.

즉, 버퍼가 없지만 받아서 소비하지 않으면 계속 블러킹 되는건가?

The capacity, in number of elements, sets the size of the buffer in the channel. If the capacity is zero or absent, the channel is unbuffered and communication succeeds only when both a sender and receiver are ready. Otherwise, the channel is buffered and communication succeeds without blocking if the buffer is not full (sends) or not empty (receives). A nil channel is never ready for communication.

[링크 : https://go.dev/ref/spec#Channel_types]

 

그런데 그렇게 보기에는..

얘는 왜 컴파일도 문제 없고, 실행시에도 아무런 메시지 출력 안되고 (deadlock 안걸리고) 잘 종료되지?

claude 답변으로는 deadlock은 실제로는 쓰레드가 모두 잠들어서 깨지 못하는 상황을 탐지하는거라

main thread가 1초 뒤에 깰꺼고 "기브니 쪼꼬렛!"은 전송되지 못하고 기다리다 종료되는거라고

$ cat ch.go
package main

import (
"fmt"
"time"
)

// sendOnly: ch1에는 보내기만 가능
func sender(ch chan string) {
ch <- "안녕하세요!"
ch <- "기브미 쪼꼬렛!"

msg := <-ch
fmt.Println(msg)
}

// recvOnly: ch1에서 받기만 가능
func receiver(ch chan string) {
msg := <-ch
fmt.Println(msg)

ch <- "느그아부지 모하시노!"
}

func main() {
ch := make(chan string) // 생성할 때는 항상 양방향으로 만듦

go sender(ch)   // sender 함수 안에서는 송신만 가능하도록 타입이 제한됨
// go receiver(ch) // receiver 함수 안에서는 수신만 가능하도록 타입이 제한됨

time.Sleep(1000 * time.Millisecond)
}

 

실제로 단계별로 해보면 "안녕하세요!" 보내고 멈춰버렸다. 그렇군.

$ cat ch.go
package main

import (
"fmt"
"time"
)

// sendOnly: ch1에는 보내기만 가능
func sender(ch chan string) {
fmt.Println("run")
ch <- "안녕하세요!"
fmt.Println("wait")
ch <- "기브미 쪼꼬렛!"
fmt.Println("oops")

msg := <-ch
fmt.Println(msg)
}

// recvOnly: ch1에서 받기만 가능
func receiver(ch chan string) {
msg := <-ch
fmt.Println(msg)

ch <- "느그아부지 모하시노!"
}

func main() {
ch := make(chan string) // 생성할 때는 항상 양방향으로 만듦

go sender(ch)   // sender 함수 안에서는 송신만 가능하도록 타입이 제한됨
// go receiver(ch) // receiver 함수 안에서는 수신만 가능하도록 타입이 제한됨

time.Sleep(1000 * time.Millisecond)
}

 

$ go run ch.go
run

 

 

+

자꾸 헷갈리게 되는데

switch-case가 있고 select-case가 있다

select-case는 채널 전용 으로 생긴건 거의 유사한데

저렇게 값을 던지고 안보고 종료하는 용도로도 쓸 수 있나 보다.

package main

import "fmt"

func fibonacci(c, quit chan int) {
    x, y := 0, 1
    for {
        select {
        case c <- x:
            x, y = y, x+y
        case <-quit:
            fmt.Println("quit")
            return
        }
    }
}

func main() {
    c := make(chan int)
    quit := make(chan int)
    go func() {
        for i := 0; i < 10; i++ {
            fmt.Println(<-c)
        }
        quit <- 0
    }()
    fibonacci(c, quit)
}

[링크 : https://go.dev/tour/concurrency/5]

 

[링크 : https://go.dev/doc/effective_go#control-structures]

[링크 : https://go.dev/doc/effective_go#leaky_buffer]

 

claude 말로는 select에서 block 되어있어서

이를 이용해 타임아웃을 구현하는데 쓸 수 있다고 한다.

package main

import (
"fmt"
"time"
)

func main() {
ch := make(chan string)

go func() {
time.Sleep(2 * time.Second)
ch <- "작업 완료"
}()

select {
case result := <-ch:
fmt.Println(result)
case <-time.After(1 * time.Second): // 1초 안에 ch가 준비 안 되면 여기 실행
fmt.Println("타임아웃!")
}
}

 

 

+

A channel may be closed with the built-in function close. The multi-valued assignment form of the receive operator reports whether a received value was sent before the channel was closed.

[링크 : https://go.dev/ref/spec#Channel_types]

 

A receive expression used in an assignment statement or initialization of the special form

x, ok = <-ch
x, ok := <-ch
var x, ok = <-ch
var x, ok T = <-ch

[링크 : https://go.dev/ref/spec#Receive_operator]

'Programming > golang' 카테고리의 다른 글

golang mutex  (0) 2026.08.25
golang Init()  (0) 2026.08.20
golang git commit hash  (0) 2025.11.24
golang 정적웹 파일 포함하기  (0) 2025.11.24
go vet (golang 정적분석)  (0) 2025.10.02
Posted by 구차니
Programming/C Win32 MFC2026. 8. 25. 10:22

기능을 찾다가 초기화 값에서 이상한 문법을 발견(!)

 

static const int rgb2ycbcr_coeff[5][3] = {
 {0x4D, 0x96, 0x1D},
 {-0x2B, -0x55, 0x80},
 {0x80, -0x6B, -0x15},
 {0x0000, 0x0200, 0x0200}, /* B0, B1, B2 */
 {0x2, 0x2, 0x2}, /* S0, S1, S2 */
};

[링크 : https://community.nxp.com/t5/i-MX-Processors-Knowledge-Base/Changing-IPU-Color-Space-Conversion-parameters/ta-p/1100972]

 

그래서 소스코드를 생성하고 타입별로 일단 시도

$ cat hex.c 
#include <stdio.h>

void main()
{
char v1 = -0xFF;
unsigned char v2 = -0xFF;
short v3 = -0xFF;
unsigned short v4 = -0xFF;
unsigned short v4_1 = -0xFFFF;
int v5 = -0xFF;
unsigned int v6 = -0xFF;

printf("%d %u %d %u %d %u\n", v1, v2, v3, v4, v5, v6);
printf("%d %d %d %d %d %d\n", v1, v2, v3, v4, v5, v6);
printf("%x %x %x\n", v2, v4, v5);
}

 

빌드! 경고가 뿜뿜. char 에는 너무 크다~ 라는게 포인트

$ gcc hex.c 
hex.c: In function ‘main’:
hex.c:5:19: warning: overflow in conversion from ‘int’ to ‘char’ changes value from ‘-255’ to ‘1’ [-Woverflow]
    5 |         char v1 = -0xFF;
      |                   ^
hex.c:6:28: warning: unsigned conversion from ‘int’ to ‘unsigned char’ changes value from ‘-255’ to ‘1’ [-Woverflow]
    6 |         unsigned char v2 = -0xFF;
      |                            ^
hex.c:9:31: warning: unsigned conversion from ‘int’ to ‘short unsigned int’ changes value from ‘-65535’ to ‘1’ [-Woverflow]
    9 |         unsigned short v4_1 = -0xFFFF;
      |  

 

근데.. 왜 unsigned  short과 unsigned int는 예상하지 못한 이상한 값이 나오지?

$ ./a.out 
1 1 -255 65281 -255 4294967041
1 1 -255 65281 -255 -255
ff01 ffffff01
1 1 ffffff01

 

아무튼 먼가 이해될 것 같으면서도 이해가 안되는 이상한 현상이 발생 ㅋㅋ

65281 4294967041

 

'Programming > C Win32 MFC' 카테고리의 다른 글

c malloc 이후 free 시에 원인불명으로 죽는 경우  (1) 2026.01.16
float 자릿수 제한  (0) 2025.10.11
free(): invalid next size (normal)  (0) 2023.12.18
c에서 cpp 함수 불러오기  (0) 2023.01.04
MSB / LSB 변환  (0) 2022.08.29
Posted by 구차니
Programming/golang2026. 8. 20. 18:48

모듈에 init() 만들어 두면 일종의 constructor 처럼 자동으로 실행이 되는데

리턴도 없고 그래서 이래저래 제약이 있는 기능이라고 한다.

[링크 :  https://ray5273.tistory.com/entry/Golang-init-사용법-및-주의-사항]

 

func init() {
    if user == "" {
        log.Fatal("$USER not set")
    }
    if home == "" {
        home = "/home/" + user
    }
    if gopath == "" {
        gopath = home + "/go"
    }
    // gopath may be overridden by --gopath flag on command line.
    flag.StringVar(&gopath, "gopath", gopath, "override default GOPATH")
}

[링크 : https://go.dev/doc/effective_go#init]

'Programming > golang' 카테고리의 다른 글

golang mutex  (0) 2026.08.25
golang channel..2 방향, select 등  (0) 2026.08.25
golang git commit hash  (0) 2025.11.24
golang 정적웹 파일 포함하기  (0) 2025.11.24
go vet (golang 정적분석)  (0) 2025.10.02
Posted by 구차니
Programming/qt2026. 8. 12. 12:40

음.. 머지? 무슨일이 있었던 걸까?

 

5.14 대의 가장 마지막 버전 5.14.2

[링크 : https://download.qt.io/archive/qt/5.14/5.14.2/]

 

5.15 대의 첫 버전 5.15.0

[링크 : https://download.qt.io/archive/qt/5.15/5.15.0/]

 

+

읭? 5.14 까진 주던데 이건또 먼소리야

Qt 5.12 LTS was the last Qt version to offer an offline installer.

[링크 : https://wiki.qt.io/Qt_version_history]

Posted by 구차니

인터프리트 언어 특성상 해보기 전에 오타나 이런걸 확인하기 좀 어려운데

py를 pyc pyo등으로 바꾸는 "컴파일"을 제공하는 언어다 보니

python byte code로 변환하기 위해 문법을 체크하는지

이걸 이용해서 문법을 우회적으로(?) 확인할 수 있다

 

$ pycompile 
Usage: pycompile [-V [X.Y][-][A.B]] DIR_OR_FILE [-X REGEXPR]
       pycompile -p PACKAGE

 

오.. 좋은데?

$ cat tt.py 
mport time

time.sleep(1)

$ pycompile tt.py 
  File "tt.py", line 1
    mport time
             ^
SyntaxError: invalid syntax

[링크 : https://salguworld.tistory.com/entry/LinuxPython-파이썬-pycompile-활용-파이썬-코드-C-코드-컴파일-예제-1단일-소스코드-컴파일]

[링크 : https://stackoverflow.com/questions/4537411/compile-but-do-not-run-a-python-script]

 

thank you claude.ai

Posted by 구차니
Programming/qt2026. 7. 1. 11:29

6.0.2 에서 qml을 열면 Designer 비활성화 되어있어서 qml을 텍스트로 수정해야 한다.

 

이전에 qt6를 깔땐 qt widget이 안되더니 먼가 하나씩 삐걱삐걱 하는 느낌?

 

qt creator 4.15 쓰니까 qml / widget 둘 다 잘 열리네 -_-

 

이제 반대로 버전 쭉쭉 올려봐야하나?

20.x 가 나온 상황인데 -_-a

'Programming > qt' 카테고리의 다른 글

qt for windows  (0) 2026.08.12
qt cmake 에서 프로젝트로 등록하기  (0) 2026.06.30
qt signal / slot, connect() Qt::AutoConnection  (0) 2026.06.30
qt5 qml 다국어지원  (0) 2026.06.30
qt5 qml Q_PROPERTY  (0) 2026.06.30
Posted by 구차니
Programming/qt2026. 6. 30. 14:23

맨땅에 헤딩하기! ㅋㅋ

클로드가 샘플을 짜주었는데 pro 파일을 생성해주지 않고

cmake만 있어서 한번 변환하는거 테스트 해봄

 

Step 1. QT Creator / Projects / NEW

 

Step 2. import project / import as qmake or cmake project

 

Step 3. .pro 파일로 만들 파일명과 저장할 경로 선택

 

Step 4. 프로젝트로 관리할 파일 추가. 빌드할 녀석들을 추가하는거라 CMakeLists.txt 와 같은 소스코드가 아닌건 빼야 한다.

진행하고 보니 qml 디렉토리를 빼먹었었네 -_-

 

Step 5. 버전관리하려면 넣고 아니면 빼고

 

Step 6. "Configure Project" 우측 하단 버튼을 꼭 눌러주어야 파일 추가되면서 제대로 생성된다.

'Programming > qt' 카테고리의 다른 글

qt for windows  (0) 2026.08.12
qtcreator 6.0.2 -> 4.15.2 다운그레이드 시도  (0) 2026.07.01
qt signal / slot, connect() Qt::AutoConnection  (0) 2026.06.30
qt5 qml 다국어지원  (0) 2026.06.30
qt5 qml Q_PROPERTY  (0) 2026.06.30
Posted by 구차니
Programming/qt2026. 6. 30. 12:40

connect() 함수를 사용하면 대개 인자를 4개만 넣고 쓰는데

함수 프로토타입을 보니 가장 마지막 인자가 기본값으로 지정되어 있다.

// qobject.h
    static inline QMetaObject::Connection connect(const typename QtPrivate::FunctionPointer<Func1>::Object *sender, Func1 signal,
                                     const typename QtPrivate::FunctionPointer<Func2>::Object *receiver, Func2 slot,
                                     Qt::ConnectionType type = Qt::AutoConnection)

 

기본은 Qt:AutoConnection 이라는데 약간의 손실 가능성이 존재하고

반드시 손실되서는 안되는 경우라면 QueuedConnection으로 하는것을 추천한다고 한다.

// qnamespace.h
    enum ConnectionType {
        AutoConnection,
        DirectConnection,
        QueuedConnection,
        BlockingQueuedConnection,
        UniqueConnection =  0x80
    };

 

DirectConnection은 다른 스레드에서 쓰면 동기화 문제 발생할수 있다는걸 보면 동일 쓰레드 내에서 써야 할듯.

[링크 : https://still.tistory.com/86]

 

 

[링크 : https://doc.qt.io/qt-6/qt.html]

'Programming > qt' 카테고리의 다른 글

qtcreator 6.0.2 -> 4.15.2 다운그레이드 시도  (0) 2026.07.01
qt cmake 에서 프로젝트로 등록하기  (0) 2026.06.30
qt5 qml 다국어지원  (0) 2026.06.30
qt5 qml Q_PROPERTY  (0) 2026.06.30
qt5 qml connections  (0) 2026.06.30
Posted by 구차니
Programming/qt2026. 6. 30. 12:31

언제나 그렇듯(?) tr() 대신 qsTr()로 감싸줘야 한다.

Text {
    id: txt1;
    text: qsTr("Back");
}

[링크 : https://doc.qt.io/archives/qt-5.15/qtquick-internationalization.html]

 

qt5.10 이전에는 retranslate()가 정상적으로 작동하지 않는 문제가 있었다고.

함수 레벨이 다름에 주의.

그런데.. installTranslator 하기 전에 removeTranslator 해줘야 하나?

    if(lang == "bg") {
     qApplication->removeTranslator(&trEN);
     qApplication->installTranslator(&trBG);
    } else if (lang == "en") {
     qApplication->removeTranslator(&trBG);
     qApplication->installTranslator(&trEN);
    }

    qmlEngine->retranslate();

[링크 : https://forum.qt.io/topic/90018/problem-with-dynamic-language-change-in-qml]

[링크 : https://wiki.qt.io/How_to_do_dynamic_translation_in_QML]

'Programming > qt' 카테고리의 다른 글

qt cmake 에서 프로젝트로 등록하기  (0) 2026.06.30
qt signal / slot, connect() Qt::AutoConnection  (0) 2026.06.30
qt5 qml Q_PROPERTY  (0) 2026.06.30
qt5 qml connections  (0) 2026.06.30
qt 동적 해상도 대응  (0) 2026.06.29
Posted by 구차니