- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我需要编写一个回调来更改存储在 GtkWidget 数组中的标签的字体颜色。
当前状态的代码在这里 https://github.com/dustynine/colta-gtk/blob/struct/src/main.c
在初始化接口(interface)的函数中,我的数组如下所示:
GtkWidget *cells[CELLS];
for (int i=0; i<CELLS; i++) {
cells[i] = gtk_label_new("██");
}
连接到按钮的回调:
g_signal_connect(
G_OBJECT(button),
"clicked",
G_CALLBACK(encode),
make_data(plaintext, key, cells)
);
make_data()
是一个返回带有回调参数的结构的函数:
struct passed_widgets {
GtkWidget *plaintext;
GtkWidget *key;
GtkWidget **cls;
};
gpointer make_data(GtkWidget *text, GtkWidget *key, GtkWidget *cells[CELLS]) {
static struct passed_widgets pw;
pw.plaintext = text;
pw.key = key;
pw.cls = cells;
return (gpointer) &pw;
}
在回调本身内部我有这个:
static void encode(GtkButton *button, gpointer *data) {
struct passed_widgets *pw;
GdkColor color;
pw = (struct passed_widgets *) data;
gdk_color_parse("#07d9d9", &color);
gtk_widget_modify_fg(GTK_WIDGET(pw -> cls[0]), GTK_STATE_NORMAL, &color);
}
编译器没有提示(除了颜色相关内容已被弃用的警告之外)但是当我实际按下按钮时 Gtk 报告:
(colta-gtk:3993): GLib-GObject-WARNING **: invalid uninstantiatable type 'GInterface' in cast to 'GtkWidget'
(colta-gtk:3993): Gtk-CRITICAL **: gtk_widget_modify_fg: assertion 'GTK_IS_WIDGET (widget)' failed
我在 gdb 中挑选了一下,根据 explore pw -> cls[0]
:
'pw -> cls[0]' is a pointer to a value of type 'GtkWidget'
那么,我该如何使它按预期工作呢?我怀疑我要么错误地将数组分配给结构(但这是程序工作的唯一方式),要么在回调结束时尝试修改它时错误地访问它。
编辑: 我按照 liberforce 的建议重写了程序。为我的图形用户界面创建了一个结构:
struct template {
GtkWidget *window;
...
GtkWidget *plaintext;
GtkWidget *cells[CELLS];
};
现在我只是将这个我实例化为 gui
的结构传递给回调:
g_signal_connect(
G_OBJECT(gui.button),
"clicked",
G_CALLBACK(encode),
&gui
);
但是我再也无法在 encode() 函数中使用任何东西了:
static void encode(GtkButton *button, gpointer data) {
gchar *plaintext;
struct template *pw;
pw = (struct template *) data;
plaintext = gtk_entry_get_text(GTK_ENTRY(pw -> plaintext));
printf(" plaintext contents: %s\n", plaintext);
我又一次不明白哪里出了问题。编译器没有发出警告,根据 gdb 类型匹配,但是当我运行程序并使用回调时,它给我:
(colta-gtk:21589): Gtk-CRITICAL **: gtk_entry_get_buffer: assertion 'GTK_IS_ENTRY (entry)' failed
(colta-gtk:21589): Gtk-CRITICAL **: gtk_entry_buffer_get_text: assertion 'GTK_IS_ENTRY_BUFFER (buffer)' failed
地址如下:
gui.plaintext address: 0x55babcfc6290
gui address: 0x7ffd13fe8a88
&gui address: 0x7ffd13fe8910
data address: 0x7ffd13fe8910
pw address: 0x7ffd13fe8910
*pw address: 0x7ffd13fe8a88
pw -> plaintext address: (nil)
*pw -> plaintext
导致 Segmentation fault
最佳答案
我想我明白了。我在 main()
struct template {
GtkWidget *window;
...
GtkWidget *plaintext;
GtkWidget *cells[CELLS];
};
然后在应用程序的“激活”信号上调用的回调中,我这样做:
static void activate(GtkApplication* app, gpointer user_data) {
static struct template gui;
gui.plaintext = gtk_entry_new();
printf("gui.plaintext address: %p\n", gui.plaintext);
g_signal_connect(
G_OBJECT(gui.button),
"clicked",
G_CALLBACK(encode),
&gui
);
在编码回调中我有这个
static void encode(GtkButton *button, gpointer data) {
gchar *plaintext;
struct template *pw;
pw = (struct template *) data;
plaintext = gtk_entry_get_text(GTK_ENTRY(pw -> plaintext));
printf(" plaintext contents: %s\n", plaintext);
GdkColor color;
gdk_color_parse("#ff0000", &color);
gtk_widget_modify_fg(GTK_WIDGET(pw -> cells[0]), GTK_STATE_NORMAL,
&color);
}
现在一切正常。基本上,我通过将 static
添加到 activate
回调中的 struct template gui
声明来解决我的问题。我将在 github 上保留该文件的工作版本的链接以供将来引用。感谢 liberforce 为我指明了正确的方向。
关于c - 如何使用回调修改 GtkWidget 数组的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47185272/
我有以下代码,我正在努力将标签对齐在中心它的父级(布局),但对我来说没有任何作用: int main(int argc, char ** argv){ GtkWidget *window;
抱歉,我是 Gtk 的新手,所以这可能是个愚蠢的问题。 我使用 Gtk+ 3.0 并有这个代码 GtkWidget *widget; widget=gtk_box_new(GTK_ORIENTATIO
是否可以创建 gtkwidgets 的多维数组?具体是这样的: mywidgetlist[2]["title"]; 或者我应该以不同的方式来做这件事?我该怎么做? 基本上,我有许多由较小的小部件组成的
我问为什么如果我决定调用另一个文件中的函数,返回的 GtkWidget* 如果使用的话会导致段错误(强制转换,如示例中的 gtk 函数,...) 在 main 中,我运行 gtk_init 并从另一个
我一直在摸不着头脑,为什么下面的代码会触发绘制回调三次而不是一次。 #include #include using namespace std; void on_draw(){ cout
我有一个 GtkImage,我正在使用 GdkPixbuf 进行操作。当我更改它时,我需要重新绘制它才能使更改生效。现在我通过隐藏然后显示图像来做到这一点。这样做的正确方法是什么? 最佳答案 gtk_
我需要能够以编程方式探索 GTK GUI 的结构。我有 GtkWidget,我想找到该小部件的任何子部件。现在我知道 GtkContainer 有一个查找子级的功能,并且 GtkContainer 是
如何在 GtkWidget 中设置前导空格?正如您在下面的图像中看到的那样,用户名/密码小部件在窗口开始时离水平线有点远 我的代码: GtkWidget *window; GtkWidget
如何在 GtkWidget 中设置前导空格?正如您在下面的图像中看到的那样,用户名/密码小部件在窗口开始时离水平线有点远 我的代码: GtkWidget *window; GtkWidget
我想创建一个 GtkWidget 类型的 10x20 数组。我想让它们每个都成为一个 GtkEventBox,我将在其中附加一个标签。 我应该如何创建和使用 2D GtkWidget* 数组? 这是我
我有一个应用程序,它基本上在终端模式下运行,但它可以在另一个线程中打开它的 GUI 部分(带有 GtkTextView 的简单窗口来打印一些消息)。当主线程中发生某些事件时,我需要手动更新此 GtkT
我想复制一个通过 GtkBuilder 加载的 GtkWidget 我的问题是告诉 Gtk 将它打包到它已经存在的同一个 vbox 中会导致错误,而且我不知道如何复制它。我想这涉及到指针和引用的困惑,
我有一个函数连接到 gtk 中组合框的“已更改”信号,它又调用另一个函数 read_button_config。 read_button_config 采用主窗口、一个组合框和一个我没有全局声明的 v
我需要编写一个回调来更改存储在 GtkWidget 数组中的标签的字体颜色。 当前状态的代码在这里 https://github.com/dustynine/colta-gtk/blob/struct
我想知道是否有一种方法可以动态地“发送到后面”或“移到前面”GtkWidget。 (我知道,可以通过更改 GtkWidget 的创建顺序来完成) 示例:(GTK+ 2.0、Cent OS 7.0、C)
我正在尝试编写一个包含 GtkBox(水平)的应用程序,我根据各种条件在其中添加动态数量的按钮(带有标签)。现在我想防止 GtkBox 增长超过(例如)600px。按钮标签可以是椭圆形的。 所以我的问
我正在用 C 编写 Gtk+3 应用程序。 用户界面是用 glade 构建的。 我创建了一个独立的 GtkBox,它应该在我的应用程序的多个地方使用。当我尝试多次使用 GtkBox 时,出现以下错误:
在大多数 pygtk 小部件页面中,它们包含称为“Attributes”、“Properties”和“Style Properties”的部分。如何更改这些特性和特性? 最佳答案 可以通过三种方式改变
是否可以将私有(private)数据添加到GtkWidget? 背景: 我有很多 GtkCheckBotton,所有这些小部件都连接到同一个回调。在回调中,我想处理小部件私有(private)数据(或
我见过的任何例子似乎都是在 GtkWidget 中嵌入 ClutterStage。 链接: http://www.openismus.com/documents/clutter_tutorial/1.
我是一名优秀的程序员,十分优秀!