要构建一个干净的GTK 4版本的我的程序(https://atomes.ipcms.fr),我需要能够在GTK 4菜单中添加pango标记,并且,菜单必须是C编码的,而不是从XML文件中读取。
这个问题遵循这篇文章中的一个问题(包含一个视觉插图):
https://discourse.gnome.org/t/gtk4-menus-and-pango-markup/8828的
一年多以前,我问过同样的问题,得到了答案,等待了很长时间才在GTK 4库中更新,希望答案在某个时候能起作用......没有...
基本上,它在从XML文件阅读菜单时工作,而在直接编码菜单元素时则不工作,我真的,真的,必须这样做。
下面是我写的一段示例代码:
#include <gtk/gtk.h>
GtkApplication * TestApp = NULL;
void menu_bar_action (GSimpleAction * action, GVariant * parameter, gpointer data)
{
gchar * name = g_strdup_printf ("%s", g_action_get_name(G_ACTION(action)));
if (g_strcmp0 (name, "quit") == 0)
{
g_application_quit (G_APPLICATION(TestApp));
}
}
GMenuItem * create_gmenu_item (const gchar * label, const gchar * action)
{
GMenuItem * item;
item = g_menu_item_new (label, action);
// Requesting to use markup here:
g_menu_item_set_attribute (item, "use-markup", "b", TRUE, NULL);
return item;
}
void append_menu_item (GMenu * menu, const gchar * label, const gchar * action)
{
GMenuItem * item = create_gmenu_item (label, action);
g_menu_append_item (menu, item);
g_object_unref (item);
}
void run_program (GApplication * app, gpointer data)
{
GtkWidget * window = gtk_application_window_new (GTK_APPLICATION(app));
gtk_window_set_title (GTK_WINDOW(window), "Test");
gtk_window_set_resizable (GTK_WINDOW(window), TRUE);
gtk_widget_set_size_request (window, 900, 450);
#ifdef UIMODE
GtkBuilder * builder = gtk_builder_new ();
gtk_builder_add_from_file (builder, "test.ui", NULL);
gtk_application_set_menubar (GTK_APPLICATION (app),
G_MENU_MODEL (gtk_builder_get_object (builder, "menubar")));
g_object_unref (builder);
#else
GMenu * menubar = g_menu_new();
GMenu * menu = g_menu_new ();
// Trying different things just in case:
append_menu_item (menu, "C(H)<sub>2</sub>", "None");
append_menu_item (menu, "C(H)<sub>3</sub>", "None");
append_menu_item (menu, "C(H)<sub>4</sub>", "None");
append_menu_item (menu, "Quit", "app.quit");
g_menu_append_submenu (menubar, "File", G_MENU_MODEL (menu));
g_object_unref (menu);
gtk_application_set_menubar (GTK_APPLICATION(app), G_MENU_MODEL(menubar));
#endif
GSimpleAction * act = g_simple_action_new ("quit", NULL);
g_signal_connect (act, "activate", G_CALLBACK(menu_bar_action), NULL);
g_action_map_add_action (G_ACTION_MAP(GTK_APPLICATION(app)), G_ACTION(act));
gtk_application_window_set_show_menubar (GTK_APPLICATION_WINDOW(window), TRUE);
gtk_window_present (GTK_WINDOW(window));
}
int main (int argc, char *argv[])
{
// setlocale(LC_ALL,"en_US");
gtk_disable_setlocale ();
TestApp = gtk_application_new (g_strdup_printf ("test._%d.gtk", (int)clock()), G_APPLICATION_DEFAULT_FLAGS);
g_signal_connect (G_OBJECT(TestApp), "activate", G_CALLBACK(run_program), NULL);
int status = g_application_run (G_APPLICATION (TestApp), 0, NULL);
g_object_unref (TestApp);
return status;
}
字符串
以及菜单的'test.ui'可选XML文件:
<?xml version="1.0" encoding="UTF-8"?>
<interface>
<menu id="menubar">
<submenu>
<attribute name="label" translatable="yes">Test</attribute>
<section>
<item>
<attribute name="label" translatable="yes">C(H)<sub>2</sub></attribute>
<attribute name="use-markup">TRUE</attribute>
<attribute name="action">None</attribute>
</item>
<item>
<attribute name="label" translatable="yes">C(H)<sub>3</sub></attribute>
<attribute name="use-markup">TRUE</attribute>
<attribute name="action">None</attribute>
</item>
<item>
<attribute name="label" translatable="yes">C(H)<sub>3</sub></attribute>
<attribute name="use-markup">TRUE</attribute>
<attribute name="action">None</attribute>
</item>
<item>
<attribute name="label" translatable="yes">Quit</attribute>
<attribute name="action">app.quit</attribute>
</item>
</section>
</submenu>
</menu>
</interface>
型
如果我使用以下方法构建代码:
#!/bin/bash
app=$1
LIBS="-Wl,--export-dynamic `pkg-config --libs gtk4`"
INCLUDES="`pkg-config --cflags gtk4`"
CFLAGS="-O2"
gcc -o $app'.x' $CFLAGS $INCLUDES $app'.c' $LIBS -DUIMODE
型
然后,从XML文件加载的菜单将正确使用pango标记。
但是如果我使用以下方法构建代码:
#!/bin/bash
app=$1
LIBS="-Wl,--export-dynamic `pkg-config --libs gtk4`"
INCLUDES="`pkg-config --cflags gtk4`"
CFLAGS="-O2"
gcc -o $app'.x' $CFLAGS $INCLUDES $app'.c' $LIBS
型
那就不要加价。
我在一个全新的Debian 12上用GTK 4.8.3进行了测试。
根据我的例子,你会明白我想显示化学式。
提前感谢如果你有任何想法来帮助!
最好的问候;- )
1条答案
按热度按时间5ssjco0h1#
不提交一个布尔值,而是提交一个字符串作为属性。
而不是:
字符串
用途:
型