首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GtkCssProvider和CSS样式的问题

GtkCssProvider和CSS样式的问题
EN

Stack Overflow用户
提问于 2021-03-22 21:25:17
回答 2查看 444关注 0票数 1

我正在使用GTK3开发简单的程序,并尝试使用GtkCssProvider为特定的小部件(片段)设置样式:

代码语言:javascript
复制
text = gtk_text_view_new();
provider = gtk_css_provider_new();
gtk_css_provider_load_from_data(provider,
                                    "textview {"
                                    "  font-family: serif;"
                                    "  font-size: 30px;"
                                    "  margin-top: 10px;"
                                    "  margin-bottom: 10px;"
                                    "  color: green;"
                                    "}",-1, NULL);
context = gtk_widget_get_style_context(text);
gtk_style_context_add_provider(context,
                                GTK_STYLE_PROVIDER(provider),
                                GTK_STYLE_PROVIDER_PRIORITY_USER);

字体属性设置正确,但边距和颜色设置不正确。我没有收到任何CSS解析错误。如果我使用g_object_set()函数来设置边距,那么一切都很正常:

代码语言:javascript
复制
g_object_set(text, "margin-top", 10, NULL);
g_object_set(text, "margin-bottom", 10, NULL);

有什么想法,出什么问题了吗?与CSS有关的东西?也许有更好的方法来处理GtkTextView属性(文本和小部件颜色)?我也尝试了GtkInspector工具和直接的CSS编辑,但这在边距和颜色方面也不起作用。

EN

回答 2

Stack Overflow用户

发布于 2021-03-22 22:26:46

显示问题的最小可编译示例(查看页边距,取消注释行57-60)。用gcc 7.5.0编译。

代码语言:javascript
复制
#include <gtk/gtk.h>
#include <gdk/gdk.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <stdbool.h>

static GtkWidget *window;
static GtkWidget* layoutGrid;
static GtkWidget* textLog;
static GtkTextBuffer* bufferLog;
static GtkCssProvider* cssProviderLog;
static GtkStyleContext* context;

gboolean wndDeleteEventHandler(__attribute__((unused)) GtkWidget* widget,
                                __attribute__((unused)) GdkEvent* event,
                                __attribute__((unused)) gpointer user_data)
{
    gtk_main_quit();
    
    return TRUE;
}

int main(int argc, char** argv)
{
    gtk_init(&argc , &argv);
    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_default_size(GTK_WINDOW(window), 640, 480);
    gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
    g_signal_connect(window, "delete-event", G_CALLBACK(wndDeleteEventHandler), NULL);

    layoutGrid = gtk_grid_new();
    gtk_widget_set_hexpand(layoutGrid, TRUE);
    gtk_widget_set_vexpand(layoutGrid, TRUE);
    gtk_container_add(GTK_CONTAINER(window), layoutGrid);

    textLog = gtk_text_view_new();
    gtk_widget_set_name(textLog, "textlog");
    bufferLog = gtk_text_view_get_buffer(GTK_TEXT_VIEW (textLog));
    cssProviderLog = gtk_css_provider_new();
    gtk_css_provider_load_from_data(cssProviderLog,
                                    "textview {"
                                    "font-family: serif;"
                                    "font-size: 30px;"
                                    "margin-top: 10px;"
                                    "margin-bottom: 10px;"
                                    "color: green;"
                                    "}",-1, NULL);
    context = gtk_widget_get_style_context(textLog);
    gtk_style_context_add_provider(context,
                                GTK_STYLE_PROVIDER(cssProviderLog),
                                GTK_STYLE_PROVIDER_PRIORITY_USER);
    gtk_text_buffer_set_text(bufferLog, "Hello, this is some text in log buffer", -1);
    gtk_widget_set_hexpand(textLog, TRUE);
    gtk_widget_set_vexpand(textLog, TRUE);
    // g_object_set(textLog, "margin-left", 20, NULL);
    // g_object_set(textLog, "margin-top", 20, NULL);
    // g_object_set(textLog, "margin-bottom", 20, NULL);
    // g_object_set(textLog, "margin-right", 20, NULL);
    gtk_grid_attach(GTK_GRID(layoutGrid), textLog, 0, 0, 1, 1);

    gtk_widget_show_all(window);
    gtk_main();
}

Makefile

代码语言:javascript
复制
C = gcc
CFLAGS = -c

OBJ = \
    screen.o

.c.o:
    $(C) $(CFLAGS) $(INCLUDES) `pkg-config --cflags --libs gtk+-3.0` $<

all: $(OBJ)
    $(C) -o test $(OBJ) `pkg-config --cflags --libs gtk+-3.0`
票数 0
EN

Stack Overflow用户

发布于 2021-03-25 19:41:32

根据GtkTextview docs中的CSS节点列表,您似乎必须在边框子节点上应用边距,并将字体应用于文本子节点,因此CSS可能如下所示:

代码语言:javascript
复制
textview border.top {
    margin-top: 10px;
}

textview border.bottom {
    margin-bottom: 10px;
}

texview text {
    font-family: serif;
    font-size: 30px;
    color: green;
}

如果这解决了你的问题,请让我知道!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66746986

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档