Проблемы при использовании gtk + 3 и Css - PullRequest
1 голос
/ 10 июля 2020

Я использую язык C для создания GUI с помощью GTK + 3, и я хочу создать стиль приложения с CSS. Проблема в том, что виджет не принимает стиль, который я им дал, если я не использую селектор * в моем файле CSS. Сначала я пытаюсь создать один файл CSS для всего приложения, используя gtk_style_context_add_provider_for_screen(), но это не сработало. Поэтому я попытался установить виджет стиля по виджету, используя функцию:

  void SetStyleWidget (GtkCssProvider *CssProvider, char *Path, GtkWidget *Widget)
{
    gtk_css_provider_load_from_path (CssProvider, Path, NULL);
                                                                   
    gtk_style_context_add_provider (gtk_widget_get_style_context(Widget), GTK_STYLE_PROVIDER(CssProvider), GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); 
                                  
    gtk_style_context_save (gtk_widget_get_style_context(Widget));
}

Это тоже не работает. Я также вижу, что это может быть проблема приоритета, но независимо от того, какой приоритет я добавляю, это не работает. Есть ли у кого-нибудь ответ на мою проблему?

Вот мой c файл и мой css:

#include <stdlib.h>
#include <gtk/gtk.h>
#include <gmodule.h>
#include <gdk-pixbuf/gdk-pixbuf.h>
#include "RandFuncGTK.h"

int main(int argc, char **argv)
{
    GtkWidget *pWindow;
    GtkWidget *pBoxLevel0;
    GtkWidget *pTitreImg;
    GtkWidget *pBoiteTitreImage;
    GtkWidget *pLabTest;
    GtkCssProvider *CssProvider;

    gtk_init(&argc, &argv);

    CssProvider = gtk_css_provider_new ();

    pWindow = CreateWindow(pWindow, "Test", 1000, 1000);

    pBoxLevel0 = gtk_box_new(GTK_ORIENTATION_VERTICAL, 100);
    gtk_container_add(GTK_CONTAINER(pWindow), pBoxLevel0);

    pLabTest = gtk_label_new("Test");
    SetStyleWidget(CssProvider, "css/labstyle.css", pLabTest);
    gtk_container_add(GTK_CONTAINER(pBoxLevel0), pLabTest);

    gtk_widget_show_all(pWindow);

    g_signal_connect(G_OBJECT(pWindow), "destroy", G_CALLBACK(gtk_main_quit), NULL);

    gtk_main();
    return EXIT_SUCCESS;

}

Вот мой css файл

GtkLabel {
    color: blue;
}

1 Ответ

2 голосов
/ 10 июля 2020

GTK прекратил использовать имена типов виджетов в качестве CSS имен узлов в версии 3.18 или около того, и с этого момента вы должны проверить документацию по классам C, чтобы узнать, какие имена узлов, классы и т. Д. Доступны для тема. В в данном случае это будет

label { [...] }

Я также рекомендую загружать StyleContext в Display, а не отдельные виджеты. Итак, в основном, используйте современную версию GTK (в идеале последняя версия 3.24.x, но не менее 3.22) и задокументированные селекторы CSS, и вам будет хорошо go.

Сделав это, если вы хотите повлиять только на отдельные виджеты, просто добавьте к ним CSS классы и выберите эти классы:

gtk_style_context_add_class(my_label_style_context, "the-precious");

, а затем выберите CSS на

label.the-precious { [...] }

или просто

.the-precious { [...] }

Более полный пример доступен в этот другой ответ .

Это лучше, чем добавление StyleContexts к отдельным виджетам, потому что это обычно не работает так, как ожидают пользователи (с точки зрения наследования и т. д.).

Вы также можете установить CSS ID для виджетов (например, #the-precious), но это используется реже, а IMO не действительно нужен в GTK и еще больше ошибок для настройки IMO.

Обратите внимание, что тема GTK по умолчанию, Adwaita, была обновлена ​​в течение 3.24 - поэтому, если вы хотите настроить тему своего приложения на это, лучше всего сделать это из последней доступной версии 3.24 - и надеяться, что она больше не изменится в 3.х ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...