ホームページ >バックエンド開発 >Golang >GTK4 applicationWindow を ui ファイルから GTK4 アプリケーションに追加できますか?

GTK4 applicationWindow を ui ファイルから GTK4 アプリケーションに追加できますか?

WBOY
WBOY転載
2024-02-09 19:24:10724ブラウズ

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

php エディター Zimo は、よくある質問に喜んで答えます: 「GTK4 applicationWindow を ui ファイルから GTK4 アプリケーションに追加できますか?」 答えは「はい」です。 GTK4 では、GtkBuilder を使用して UI ファイルをロードし、その中の applicationWindow ウィジェットを GTK アプリケーションに追加できます。これにより、アプリケーション インターフェイスの設計と管理がより便利になり、開発効率が向上します。ただし、UI ファイルを正常にロードするには、GTK4 に関連するライブラリとツールがシステムにインストールされていることを確認する必要があることに注意してください。この回答がお役に立てば幸いです!

質問の内容

GTK を使用してまだ数日ですが、Go プログラムには GUI が必要なので、これは初心者の質問です。初心者なので、Cambalache を使用して .UI ファイルを生成し、それを Go アプリケーションで呼び出すという、見つけられる最も簡単な方法を採用しました。

.UI ファイルの ApplicationWindow の下にすべてを配置し、それを読み込んで gkt4-builder-tool で正常に動作させますが、私の Go アプリにはイベントがありませんプログラム内の GUI。サンプル コードを見ると、Go プログラムでインスタンス化された GTK アプリケーションに ApplicationWindow をアタッチする必要があることがわかり、次のように >ApplicationWindow を変更しました。 GTK アプリケーションに通常のウィンドウを追加できるため、ウィンドウだけで問題なく動作します。

問題は、UI ファイルから ApplicationWindow を抽出してアプリケーションに添付する方法が見つからないことです。ウィンドウをアプリケーションにアタッチする唯一の方法は app.AddWindow() ですが、これは GtkApplicationWindow ではなく GtkWindow を追加するだけであり、go のような厳密に型指定された言語で追加されます。それは「ノーゴー」です(ダジャレではありません)。

GTK アプリケーションを ApplicationWindow とともに .UI ファイルに直接エクスポートできます。理論的には、これが正常に実行できれば、おそらくこの方法で接続することで両方を抽出できますが、私はgkt4-builder-tool が (複数の構成を試した後) 検証エラーを繰り返し発生するため、GTK アプリケーション、ApplicationWindow、およびメニューを正常にエクスポートできませんでした。そのため、Cambalache はその組み合わせをエクスポートする方法がわからない、またはエクスポートする方法がわからない、または実際には .UI ファイル内の正当な組み合わせではありません。

そこで私の質問は、ApplicationWindow を .UI ファイルに保存するのをやめて、コード内で ApplicationWindow ウィジェットを構築するだけでよいでしょうか、それとも何か他の選択肢があるでしょうか?まだ学習していないのですか?

本当に必要でない場合は、ApplicationWindow を無視して、Windows を別のパスとして使用することもできます。

あなたの知識と経験に感謝します。

###ありがとう!

更新:

Kripto のコメントに基づいてさらに明確になります。

これがコードです。これは直接実行されません。これは、より大きなプログラムから main() 内の関連するスニペットを抽出しており、

env, log := boot.Initialize() がこのスニペットに存在しないためです。問題を理解することが重要です。

GTK GUI には

アプリケーション ウィンドウ が 1 つしかないことはわかっています。この概念は、同じではないにしても、古い Visual Basic 時代の アプリケーション ウィンドウ に似ています。

以下は、

go コードと、.UI ファイル内の関連要素を含む要約バージョンです:

.UI ファイルの 8 行目を変更すると:

8123e48c5002051e5e3cadeb41cc56f6 ###に関して:###

2474e20c2716df4ddfdb5cde8a14f2e0

Go Code

.UI ファイルを開き、機能しますが、アプリケーション ウィンドウが表示されません。 .UI

ファイルの 8 行目をそのままにしても、ファイルは開きますが、結果として得られる GUI は非対話型であり、実行中の Go プログラムを停止した場合にのみオフになります。

GoLand のデバッグ モードで実行中。これを実行するには、go プログラムに 2 つの変更を加える必要があったためです。 : 次の行を変更します:

  1. appWindow := builder.GetObject(
appWin

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

appWin

).Cast().(*gtk.ApplicationWindow)

この行をコメントアウトします:

    app.AddWindow(appWindow)
2 番目のウィンドウが問題です。ウィンドウがアプリケーションにアタッチされていないため、非対話型になっていると思います。

リーリー これは .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 文件中。无论如何,它往往会抛出错误。

以上がGTK4 applicationWindow を ui ファイルから GTK4 アプリケーションに追加できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。