Maison > développement back-end > Golang > le corps du texte

Pouvez-vous ajouter une applicationWindow GTK4 à partir d'un fichier ui à une application GTK4 ?

WBOY
Libérer: 2024-02-09 19:24:10
avant
643 Les gens l'ont consulté

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

L'éditeur PHP Zimo est heureux de répondre à une question fréquemment posée : "Pouvez-vous ajouter une applicationWindow GTK4 à partir d'un fichier ui à une application GTK4 ?" Dans GTK4, vous pouvez utiliser GtkBuilder pour charger le fichier d'interface utilisateur et y ajouter le widget applicationWindow à votre application GTK. De cette façon, vous pouvez concevoir et gérer l'interface de l'application plus facilement et améliorer l'efficacité du développement. Cependant, veuillez noter que pour charger correctement les fichiers de l'interface utilisateur, vous devez vous assurer que les bibliothèques et outils appropriés pour GTK4 sont installés sur votre système. J'espère que cette réponse vous aidera !

Contenu de la question

Je n'utilise GTK que depuis quelques jours et c'est une question de débutant car j'ai besoin d'une interface graphique pour mon programme go. En tant que débutant, j'ai choisi le moyen le plus simple que j'ai pu trouver pour commencer à utiliser Cambalache en générant un fichier .UI, puis en l'appelant dans mon application go.

J'ai tout mis sous ApplicationWindow dans le fichier .UI et je l'ai laissé se charger et fonctionner correctement avec gkt4-builder-tool, mais dans mon application go, je n'ai pas d'événements dans l'interface graphique. En regardant l'exemple de code, j'ai découvert que je devais attacher le ApplicationWindow à l'application GTK instanciée dans mon programme go et j'ai changé le >ApplicationWindow en juste une fenêtre et cela a bien fonctionné car je pouvais ajouter une fenêtre normale à une application GTK.

Le problème est que je ne trouve pas de moyen d'extraire la ApplicationWindow du fichier UI, puis de la joindre à l'application. La seule façon d'attacher une fenêtre à une application est app.AddWindow() mais elle ajoute seulement un GtkWindow, pas un GtkApplicationWindow et dans un langage fortement typé comme go, c'est "no go" (sans jeu de mots) .

Vous pouvez exporter une application GTK avec une ApplicationWindow directement dans un fichier .UI, et en théorie, si vous pouvez le faire avec succès, vous pouvez les extraire toutes les deux et peut-être les concaténer de cette façon. Cependant, je n'ai pas réussi à exporter le Application GTK, ApplicationWindow et menu car gkt4-builder-tool continue de recevoir des erreurs de validation (après avoir essayé plusieurs configurations), donc Cambalache ne sait pas comment exporter cette combinaison ou je ne sais pas comment l'obtenir ; pour ce faire ; ou s'il ne s'agit pas réellement d'une combinaison légale dans le fichier .UI.

Ma question est donc la suivante : dois-je renoncer à essayer de stocker la ApplicationWindow dans le fichier .UI et simplement créer le widget ApplicationWindow dans le code, ou existe-t-il une autre option ? Vous ne l'avez pas encore appris ?

Si ce n'est pas vraiment nécessaire, je pourrais abandonner ApplicationWindow et utiliser Windows comme autre chemin.

Merci pour vos connaissances et votre expérience.

Merci !

Mise à jour :

Plus clair d'après les commentaires de Kripto.

Voici le code. Cela ne fonctionnera pas directement car j'ai extrait l'extrait pertinent dans main() d'un programme plus grand et env, log := boot.Initialize() n'existe pas dans cet extrait, mais il n'est pas important de comprendre le problème.

Je sais qu'il n'y a qu'une seule fenêtre d'application dans l'interface graphique GTK. Le concept est similaire, sinon identique, à la Application Window de mon ancien Visual Basic.

Voici le go code et une version condensée contenant les éléments pertinents du fichier .UI :

Si je change la ligne 8 dans le fichier .UI :

<object class="GtkApplicationWindow" id="appWin">

À ceci :

<object class="GtkWindow" id="appWin">

Le

Go code ouvrira le fichier .UI et cela fonctionne, mais maintenant je n'ai plus la fenêtre de l'application.

Si je laisse la ligne 8 du fichier .UI telle quelle, le fichier s'ouvre toujours, mais l'interface graphique résultante n'est pas interactive et ne se ferme que lorsque j'arrête mon programme Go en cours d'exécution dans Exécuter en mode débogage dans GoLand. En effet, pour l'exécuter, j'ai dû apporter deux modifications au programme go. :

  1. Modifiez cette ligne :

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

à

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

  1. Commentez cette ligne :

app.AddWindow(appWindow)

Le deuxième est le problème car maintenant la fenêtre n'est plus attachée à l'application et je suis sûr que c'est pour cela qu'elle n'est pas interactive.

package main

import (
    "os"

    "github.com/diamondburned/gotk4/pkg/gio/v2"
    "github.com/diamondburned/gotk4/pkg/gtk/v4"

    "gitlab.com/trading5124936/core.git/loggers"
)

func main() {
    env, log := boot.Initialize()
    var app *gtk.Application
    app = gtk.NewApplication(`site.TradingAnalyzer`, gio.ApplicationFlagsNone)
    app.ConnectActivate(func() { activate(app, log, env.Paths.GUIFile) })

    if code := app.Run(os.Args); code > 0 {
        os.Exit(code)
    }

}

func activate(app *gtk.Application, log *loggers.Logger, guiPath string) {
    // You can build UIs using Cambalache (https://flathub.org/apps/details/ar.xjuan.Cambalache)

    b, err := os.ReadFile(guiPath)
    if err != nil {
        log.Critical(err)
        return
    }
    uiXML := string(b)

    builder := gtk.NewBuilderFromString(uiXML, len(uiXML))

    // MainWindow and Button are object IDs from the UI file
    appWindow := builder.GetObject(`appWin`).Cast().(*gtk.Window)

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

    app.AddWindow(appWindow)
    appWindow.Show()

}
Copier après la connexion

Voici le fichier .UI :

<?xml version='1.0' encoding='UTF-8'?>
<!-- Created with Cambalache 0.16.0 -->
<interface domain="ta.site">
  <!-- interface-name TradingAnalyzer.ui -->
  <!-- interface-authors Reg Proctor -->
  <requires lib="gtk" version="4.6"/>
  <object class="GtkApplication" id="app"/>
  <object class="GtkApplicationWindow" id="appWin">
    <property name="default-height">925</property>
    <property name="default-width">1200</property>
    <child>
      <object class="GtkPaned">
        <child>
          <object class="GtkFrame">
            <property name="label">Settings</property>
            <child>
              <object class="GtkStackSidebar">
                <property name="halign">start</property>
                <property name="height-request">900</property>
                <property name="stack">pages</property>
                <property name="valign">start</property>
              </object>
            </child>
          </object>
        </child>
        <child>
          <object class="GtkFrame">
            <child>
              <object class="GtkStack" id="pages">
                <property name="name">Timezone</property>
                <child>
                  <object class="GtkStackPage" id="GeneralSetup">
                    <property name="child">
                      <object class="GtkFlowBox">
                        <property name="margin-bottom">20</property>
                        <property name="margin-end">50</property>
                        <property name="margin-start">50</property>
                        <property name="margin-top">20</property>
                        <property name="name">Timezone</property>
                        <child>
                          <object class="GtkEntry" id="GeneralSetup.Timezone">
                            <property name="activates-default">True</property>
                            <property name="halign">start</property>
                            <property name="height-request">10</property>
                            <property name="input-purpose">alpha</property>
                            <property name="placeholder-text">Timezone</property>
                            <property name="text">America/Phoenix</property>
                            <property name="tooltip-text">Enter your timezone</property>
                            <property name="valign">center</property>
                            <property name="width-request">50</property>
                          </object>
                        </child>
                      </object>
                    </property>
                    <property name="name">General Setup</property>
                    <property name="title">General Setup</property>
                  </object>
                </child>
              </object>
            </child>
          </object>
        </child>
      </object>
    </child>
  </object>
</interface>
Copier après la connexion

Mise à jour 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()

}

Copier après la connexion

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

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

解决方法

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

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

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!