Как установить тему из ресурса css для нескольких виджетов glade в gtkmm3 - PullRequest
0 голосов
/ 29 августа 2018

Я сделал все включения и использованные пространства имен

#include "include/main.h"
#include <iostream>
#include <gtkmm.h>

using namespace std;
using namespace Gtk;

Window* appWindow = nullptr;

Загрузил файл glade и попытался загрузить тему для виджетов

    auto refBuilder = Builder::create();
    auto refProvider = CssProvider::create();
    auto refStyleContext = StyleContext::create();

try
{
    refBuilder->add_from_resource("/res/gui.glade");
    refProvider->load_from_resource("/res/theme.css");
}

Поймали ошибки. Который это делает. Выдает ошибку, когда не может загрузить ни один из ресурсов.

catch(const Glib::FileError& ex)
{
    cerr << "FileError: " << ex.what() << endl;
    return 1;
}
catch(const Glib::MarkupError& ex)
{
    cerr << "MarkupError: " << ex.what() << endl;
    return 1;
}
catch(const Gtk::BuilderError& ex)
{
    cerr << "BuilderError: " << ex.what() << endl;
    return 1;
}

Теперь я не могу применить CSS для моих виджетов

refBuilder->get_widget("winFrame", appWindow);
if(appWindow)
{
    Glib::RefPtr<Gdk::Screen>refScreen = appWindow->get_screen();

    refBuilder->get_widget("quit_Item", quitItem);
    refStyleContext->add_provider_for_screen(refScreen, refProvider, GTK_STYLE_PROVIDER_PRIORITY_USER);

    if(quitItem)
    {
        quitItem->signal_activate().connect( sigc::ptr_fun(on_button_clicked) );
    };

};
app->run(*appWindow);
delete appWindow;
return 0;

У меня есть следующий CSS, который я пробовал, но даже кнопка не изменила цвет

.recordButton {
color: red;
background: blue;
border-color: red;
}

GtkBox{
background: #669999;
text-shadow: 1px 1px 5px black;
box-shadow: 0px 0px 5px black;
border: 1px solid black;
}
Buton{
background: #669999;
text-shadow: 1px 1px 5px black;
box-shadow: 0px 0px 5px black;
border: 1px solid black;
}

1 Ответ

0 голосов
/ 30 августа 2018

После пересмотра моего кода. Я пытался скопировать заявления для

try{}
catch {}

Вот так я смог заставить его работать

refBuilder->get_widget("winFrame", appWindow);
if(appWindow)
{
    try
    {
        refProvider->load_from_resource("/res/default-theme.css");
        Glib::RefPtr<Gdk::Screen> refScreen = appWindow->get_screen();
        refStyleContext->add_provider_for_screen(refScreen, refProvider, GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
    }
    catch(const Gio::ResourceError& ex)
    {
        cerr << "ResourceError: " << ex.what() << endl;
        return 1;
    }
    catch(const Glib::MarkupError& ex)
    {
        cerr << "MarkupError: " << ex.what() << endl;
        return 1;
    }
    catch(const Gtk::CssProviderError& ex)
    {
        cerr << "CssProviderError: " << ex.what() << endl;
        return 1;
    }
    catch(const Glib::Error& ex)
    {
        cerr << "GlibError: " << ex.what() << endl;
        return 1;
    };

};

Я также узнал, что у моего формата файла css есть проблемы. Я получил помощь от GTK + CSS Reference . На моей поляне есть GtkBox после окон, поэтому новый css имеет

box * {
background-color: teal;
font: italic bold 14px Ani;
}

Который был применен к ребенку под GtkBox К сожалению, я все еще работаю над созданием границ вокруг виджетов, но, по крайней мере, теперь я знаю, что тема css применяется

...