>백엔드 개발 >Golang >ui 파일의 GTK4 applicationWindow를 GTK4 애플리케이션에 추가할 수 있습니까?

ui 파일의 GTK4 applicationWindow를 GTK4 애플리케이션에 추가할 수 있습니까?

WBOY
WBOY앞으로
2024-02-09 19:24:10721검색

您可以将 GTK4 applicationWindow 从 ui 文件添加到 GTK4 应用程序吗?

php 편집자 Zimo는 "ui 파일의 GTK4 applicationWindow를 GTK4 애플리케이션에 추가할 수 있습니까?"라는 자주 묻는 질문에 기꺼이 답변해 드립니다. 대답은 '예'입니다! GTK4에서는 GtkBuilder를 사용하여 UI 파일을 로드하고 그 안에 applicationWindow 위젯을 GTK 애플리케이션에 추가할 수 있습니다. 이러한 방식으로 애플리케이션 인터페이스를 보다 편리하게 디자인하고 관리할 수 있으며 개발 효율성을 향상시킬 수 있습니다. 그러나 UI 파일을 성공적으로 로드하려면 GTK4 관련 라이브러리와 도구가 시스템에 설치되어 있는지 확인해야 합니다. 이 답변이 도움이 되기를 바랍니다!

질문 내용

저는 GTK을 며칠밖에 사용하지 않았는데 바둑 프로그램에 GUI가 필요해서 초보자 질문입니다. 저는 초보자이기 때문에 .UI 파일을 생성한 다음 Go 앱에서 호출하여 Cambalache 사용을 시작할 수 있는 가장 쉬운 방법을 선택했습니다.

모든 것을 .UI 파일의 ApplicationWindow에 넣고 gkt4-builder-tool을 사용하여 로드하고 제대로 작동하도록 두었지만 Go 애플리케이션에는 GUI에 이벤트가 없습니다. 샘플 코드를 보면 ApplicationWindow를 내 Go 프로그램에서 인스턴스화된 GTK 애플리케이션에 첨부해야 한다는 것을 알았고 >ApplicationWindow를 그냥 창으로 변경했는데 일반 창을 추가할 수 있기 때문에 제대로 작동했습니다. GTK 애플리케이션에.

문제는 UI 파일에서 ApplicationWindow를 추출하여 애플리케이션에 첨부하는 방법을 찾을 수 없다는 것입니다. 애플리케이션에 창을 연결하는 유일한 방법은 app.AddWindow()이지만 GtkApplicationWindow가 아닌 GtkWindow만 추가하며 go와 같은 강력한 유형의 언어에서는 "no go"입니다(말장난 의도 없음). .

ApplicationWindow가 있는 GTK 애플리케이션을 .UI 파일로 직접 내보낼 수 있으며 이론적으로 이 작업을 성공적으로 수행할 수 있다면 둘 다 추출하고 이 방법으로 연결할 수도 있습니다. 그러나 를 성공적으로 내보내지 못했습니다. GTK 애플리케이션, ApplicationWindow 및 메뉴는 gkt4-builder-tool이 여러 구성을 시도한 후 계속해서 유효성 검사 오류를 발생시키므로 Cambalache 가 해당 조합을 내보내는 방법을 모르거나 이를 얻는 방법을 모르기 때문입니다. 이를 수행하거나 실제로 .UI 파일에서 합법적인 조합이 아닌 경우.

그래서 제 질문은 ApplicationWindow를 .UI 파일에 저장하는 것을 포기하고 ApplicationWindow 위젯을 코드로 빌드해야 하는가입니다. 아니면 다른 옵션이 있습니까? 아직 배우지 못하셨나요?

꼭 필요하지 않다면 ApplicationWindow를 버리고 Windows를 다른 경로로 사용할 수도 있습니다.

당신의 지식과 경험에 감사드립니다.

감사합니다!

업데이트:

Kripto의 의견을 바탕으로 더욱 명확해졌습니다.

코드는 다음과 같습니다. 더 큰 프로그램에서 main()의 관련 조각을 추출했고 env, log := boot.Initialize() 이 조각에는 존재하지 않기 때문에 이것은 직접 실행되지 않지만 문제를 이해하는 것은 중요하지 않습니다.

GTK GUI에는 응용 프로그램 창이 하나만 있다는 것을 알고 있습니다. 개념은 예전 Visual Basic 시절의 Application Window과 동일하지는 않더라도 비슷합니다.

다음은 go 코드.UI 파일의 관련 요소가 포함된 압축 버전입니다.

.UI 파일에서 8행을 변경하는 경우:

30d13d358b30f254a61132730e629276

이것에:

c1b6b103a658abde6319355edf92688c

Go 코드.UI 파일을 열고 작동하지만 지금은 응용 프로그램 창이 없습니다.

.UI 파일의 8행을 그대로 두면 파일은 계속 열리지만 결과 GUI는 비대화형이며 GoLand에서 디버그 모드로 실행에서 실행 중인 Go 프로그램을 중지할 때만 닫힙니다. . 그 이유는 그것을 실행하기 위해 go 프로그램에 두 가지 변경 사항을 적용해야 했기 때문입니다. :

  1. 이 줄을 바꾸세요:

appWindow := builder.GetObject(appWin).Cast().(*gtk.Window)

to

appWindow := builder.GetObject(appWin).Cast().(*gtk.ApplicationWindow)

  1. 다음 줄을 주석 처리하세요:

app.AddWindow(appWindow)

두 번째는 문제입니다. 이제 창이 애플리케이션에 연결되지 않아서 대화형이 아닌 것이 확실하기 때문입니다.

으아악

.UI 파일은 다음과 같습니다.

으아악

업데이트 2

我找到了部分答案。您可以做到这一点,但您需要将 App 添加到 ApplicationWindow 中,而不是相反,因此这是一个不同的功能。这是它的工作方式(它也有点短,因为我了解到有一个从文件加载的函数):

func activate(app *gtk.Application, log *loggers.Logger, guiPath string, appName string) {

    const ext = `.ui`

    guiPath += `/`
    builder := gtk.NewBuilderFromFile(guiPath + appName + ext)
    // builder := gtk.NewBuilderFromFile(guiPath + `Another template File.ui`)

    appWindow := builder.GetObject(`appWin`).Cast().(*gtk.ApplicationWindow)

    entry := builder.GetObject(`GeneralSetup.Timezone`).Cast().(*gtk.Entry)
    entry.Connect("changed", func() {
        println(`Changed`)
    })

    // ***** THE LINE THAT MAKES THE DIFFERENCE ***
    appWindow.SetApplication(app)
    appWindow.Show()

}

我仍然不确定是否存在将应用程序对象导出到这些 .UI 文件之一的情况。

我还没有找到任何人这样做的例子,我倾向于相信这不是你应该做的,但我仍在学习,所以很容易出错。

解决方法

更新 2 提供了此问题的大部分答案。

此外,到目前为止,我认为没有任何理由将应用程序添加到 UI 文件中。无论如何,它往往会抛出错误。

위 내용은 ui 파일의 GTK4 applicationWindow를 GTK4 애플리케이션에 추가할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 stackoverflow.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제