Bolehkah anda menambah GTK4 applicationWindow daripada fail ui kepada aplikasi GTK4?

WBOY
Lepaskan: 2024-02-09 19:24:10
ke hadapan
643 orang telah melayarinya

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

Editor PHP Zimo dengan senang hati menjawab soalan lazim: "Bolehkah anda menambah aplikasi GTK4 daripada fail ui kepada aplikasi GTK4?" Dalam GTK4, anda boleh menggunakan GtkBuilder untuk memuatkan fail UI dan menambah widget applicationWindow di dalamnya pada aplikasi GTK anda. Dengan cara ini, anda boleh mereka bentuk dan mengurus antara muka aplikasi dengan lebih mudah dan meningkatkan kecekapan pembangunan. Walau bagaimanapun, sila ambil perhatian bahawa untuk berjaya memuatkan fail UI, anda perlu memastikan bahawa perpustakaan dan alatan yang berkaitan untuk GTK4 dipasang dalam sistem anda. Harap jawapan ini membantu anda!

Kandungan soalan

Saya hanya menggunakan GTK selama beberapa hari dan ini adalah soalan baru kerana saya memerlukan GUI untuk program go saya. Sebagai seorang pemula, saya menggunakan cara paling mudah yang saya dapati untuk mula menggunakan Cambalache dengan menjana fail .UI dan kemudian memanggilnya dalam apl go saya.

Saya meletakkan semuanya di bawah ApplicationWindow dalam fail .UI dan biarkan ia dimuatkan dan berfungsi dengan baik dengan gkt4-builder-tool, tetapi dalam apl go saya, saya tidak mempunyai acara dalam GUI. Melihat kod sampel, saya mendapati bahawa saya perlu melampirkan ApplicationWindow pada aplikasi GTK yang diinstakan dalam program go saya dan saya menukar >ApplicationWindow kepada hanya tetingkap dan ia berfungsi dengan baik kerana saya boleh Menambah tetingkap biasa ke aplikasi GTK.

Masalahnya ialah saya tidak dapat mencari cara untuk mengekstrak ApplicationWindow daripada fail UI dan kemudian melampirkannya pada aplikasi. Satu-satunya cara untuk melampirkan tetingkap pada aplikasi ialah app.AddWindow() tetapi ia hanya menambah GtkWindow, bukan GtkApplicationWindow dan dalam bahasa yang ditaip kuat seperti go ia "tidak boleh pergi" (tiada pun dimaksudkan) .

Anda boleh mengeksport aplikasi GTK dengan ApplicationWindow terus ke dalam fail .UI, dan secara teori jika anda boleh melakukannya dengan jayanya, anda boleh mengekstrak kedua-duanya dan mungkin menggabungkannya dengan cara ini, Walau bagaimanapun, saya tidak berjaya mengeksport Aplikasi GTK, ApplicationWindow dan menu kerana gkt4-builder-tool terus mendapat ralat pengesahan (selepas mencuba berbilang konfigurasi), jadi Cambalache tidak tahu cara mengeksport kombinasi itu atau saya tidak tahu cara mendapatkannya untuk melakukan ini; atau jika ia sebenarnya bukan gabungan undang-undang dalam fail .UI.

Jadi soalan saya ialah, patutkah saya berhenti mencuba untuk menyimpan ApplicationWindow dalam fail .UI dan hanya membina widget ApplicationWindow dalam kod, atau adakah terdapat pilihan lain? Belum belajar lagi?

Jika ia tidak benar-benar perlu, saya boleh membuang ApplicationWindow dan menggunakan Windows sebagai laluan lain.

Terima kasih atas pengetahuan dan pengalaman anda.

Terima kasih!

Kemas kini:

Lebih jelas berdasarkan komen Kripto.

Ini kodnya. Ini tidak akan dijalankan secara langsung kerana saya mengekstrak coretan yang berkaitan dalam main() daripada program yang lebih besar dan env, log := boot.Initialize() tidak wujud dalam coretan ini, tetapi tidak penting untuk memahami masalah itu.

Saya tahu hanya ada satu tetingkap aplikasi dalam GUI GTK. Konsepnya serupa, jika tidak sama, dengan Tetingkap Aplikasi dari zaman Visual Basic lama saya.

Berikut ialah kod go dan versi ringkas yang mengandungi elemen yang berkaitan daripada fail .UI:

Jika saya menukar baris 8 dalam fail .UI:

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

Untuk ini:

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

Kod

Go akan membuka fail .UI dan ia berfungsi, tetapi sekarang saya tidak mempunyai tetingkap aplikasi.

Jika saya membiarkan baris 8 dalam fail .UI seperti sedia ada, maka ia masih membuka fail, tetapi GUI yang terhasil adalah tidak interaktif, dan ia hanya ditutup apabila saya menghentikan program Go saya yang sedang dijalankan dalam Jalankan dalam mod nyahpepijat dalam GoLand. Ini kerana untuk menjalankannya saya terpaksa membuat dua perubahan pada program go. :

  1. Tukar baris ini:

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

kepada

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

  1. Ulas baris ini:

app.AddWindow(appWindow)

Yang kedua adalah masalah kerana sekarang tetingkap tidak dipasang pada aplikasi dan saya pasti sebab itu ia tidak interaktif.

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()

}
Salin selepas log masuk

Ini ialah fail .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>
Salin selepas log masuk

Kemas kini 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()

}

Salin selepas log masuk

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

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

解决方法

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

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

Atas ialah kandungan terperinci Bolehkah anda menambah GTK4 applicationWindow daripada fail ui kepada aplikasi GTK4?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!