如何在gtk标签中将括号作为url的一部分呈现?

时间:2013-12-18 22:51:19

标签: html c gtk

我在应用程序中使用gtk,并且我利用gtklabel文本的功能自动呈现为可点击的URL。这在大多数情况下运行良好,但是使用包含括号“(”和“)”的url这不起作用。我使用的版本是debian(旧)稳定版本,即debian 6(2.20)和7(3.4.2)。

例如,我正在尝试显示以下网址:

https://maps.google.com/maps?q=62.1891,+-141.5372+(Example+text+in+here+will+be+rendered+in+the+maps+label)&iwloc=A&hl=en

当我使用此文本创建gtklabel时,例如:

text="<b><a href=\"https://maps.google.com/maps?q=62.1891,+-141.5372+(Example+text+in+here+will+be+rendered+in+the+maps+label)&iwloc=A&hl=en\" title=\"Map\">Click here for Map</a></b>\n"

然后它会在标签中显示为带下划线的粗体链接,文字点击此处查看地图

但是,当您点击该链接时,它将无法正确显示,并显示此错误:

Gtk-WARNING **: Unable to show '(null)': Operation not supported

看起来这些括号弄乱了gtk渲染网址。

有没有办法逃避括号,或者使用在地图网址中有效的其他字符来创建标签?

我尝试了各种逃避它的方法,但到目前为止没有一种方法有效。例如使用%28和%29将括号和反斜杠替换为转义字符。

我使用的是https://developer.gnome.org/gtk2/2.24/GtkLabel.htmlhttps://developer.gnome.org/gtk3/stable/GtkLabel.html中描述的方法,它允许自动呈现链接:

  

链接

     

自2.18起,GTK +还支持可点击超链接的标记   定期Pango标记。链接的标记来自HTML,   使用带有href和title属性的a。 GTK +呈现类似的链接   它们在Web浏览器中的显示方式,带有彩色下划线的文本。   title属性在链接上显示为工具提示。一个例子   看起来像这样:

     

1 gtk_label_set_markup(标签,“转到http://www.gtk.org \”title = \“&lt; i&gt;我们的&amp; / i&gt;网站\”&gt; GTK +   网站了解更多...“);

我知道它正在更新的gtk(2.24和3.6)版本中工作,确保逃脱&符号。但我想知道是否有旧的gtk版本可以解决这个问题呢?

2 个答案:

答案 0 :(得分:2)

您应该使用&amp;转发&符号。

我非常确定GTK会在您拨打gtk_label_set_markup()时打印出运行时警告,告诉您这一点。

以下是GTK 3.6.4的警告:

Gtk-WARNING **: Failed to set text from markup due to error parsing markup: Error on line 1: Entity did not end with a semicolon; most likely you used an ampersand character without intending to start an entity - escape ampersand as &amp;

答案 1 :(得分:1)

jku是对的,&符号需要被转义。他是一个使用与你完全相同的字符串的例子,它可以工作(在3.6.4和2.24.17上测试)。

#include <gtk/gtk.h>

int
main (int argc, char **argv)
{
    gtk_init (&argc, &argv);

    GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
//  This one won't work, needs ampersand escaping
//  GtkWidget *label = gtk_label_new ("<b><a href=\"https://maps.google.com/maps?q=62.1891,+-141.5372+(Example+text+in+here+will+be+rendered+in+the+maps+label)&iwloc=A&hl=en\" title=\"Map\">Click here for Map</a></b>\n");
    GtkWidget *label = gtk_label_new ("<b><a href=\"https://maps.google.com/maps?q=62.1891,+-141.5372+(Example+text+in+here+will+be+rendered+in+the+maps+label)&amp;iwloc=A&amp;hl=en\" title=\"Map\">Click here for Map</a></b>\n");
    gtk_label_set_use_markup (GTK_LABEL (label), TRUE);
    gtk_container_add (GTK_CONTAINER(window), label);
    gtk_widget_show_all (GTK_WIDGET (window));
    g_signal_connect (window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
    gtk_main ();
    return 0;
}

原始回答:

您是否曾尝试使用该链接调用gtk_show_uri?然后,您可以查看处理URI的问题是否存在问题,或者标签的格式/构造方式是否存在问题。