在 GTK+ 中,是否可以访问 GtkWidget -- 文件名的文本条目GtkFileChooser
?我想使用禁用文本条目的可编辑属性gtk_entry_set_editable
。
问问题
261 次
2 回答
1
据我所知,没有。
你最终想要达到什么目标?也许还有另一种方法。
于 2012-08-27T12:35:01.477 回答
0
如果有正当理由获取指向 GtkEntry 的指针,则从 GtkFileChooserDialog 派生,它可能会变异为 GtkFileChooserDefault。GObject 在检查类型实例时会抱怨非法转换,即使它可以工作并且派生对象的数据可以无错误地访问,使用 GTK_FILE_CHOOSER 而不是 MY_FILE_CHOOSER 以避免警告消息和入口指针的本地静态。在构建过程中无法访问入口小部件。以下是相关代码:
static GtkEntry *chooser_entry;
static void my_file_chooser_finalize (GObject *object)
{
chooser_entry = NULL;
(G_OBJECT_CLASS (my_file_chooser_parent_class))->finalize (object);
}
static void my_file_chooser_init (MyFileChooser *self)
{
chooser_entry = NULL;
}
static void look_for_entry(GtkWidget *widget, void *self)
{
if (GTK_IS_ENTRY(widget)) {
chooser_entry = (GtkEntry*)widget;
}
else if (GTK_IS_CONTAINER(widget)) {
gtk_container_forall ( GTK_CONTAINER (widget), look_for_entry, self);
}
}
static void file_chooser_find_entry (GtkWidget *chooser)
{
GList *children, *iter;
/* Get all objects inside the dialog */
children = gtk_container_get_children (GTK_CONTAINER (chooser));
for (iter = children; iter; iter = iter->next) {
if (GTK_IS_CONTAINER(iter->data)) {
gtk_container_forall ( GTK_CONTAINER (iter->data), look_for_entry, chooser);
if (chooser_entry != NULL) {
break;
}
}
}
g_list_free (children);
}
GtkEntry *my_file_chooser_get_entry (GtkWidget *widget)
{
if (chooser_entry == NULL) {
file_chooser_find_entry (widget);
}
return chooser_entry;
}
char *my_file_chooser_get_entry_text(GtkWidget *widget)
{
char *text;
GtkEntry *entry;
text = NULL;
if (GTK_IS_FILE_CHOOSER(widget)) {
entry = my_file_chooser_get_entry(widget);
if (GTK_IS_ENTRY(entry)) {
if (gtk_entry_get_text_length (entry)) {
text = g_strdup (gtk_entry_get_text(entry));
}
}
}
return text;
}
也许不理想,但有效。
于 2014-09-20T09:54:01.197 回答