- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我用glade创建了非常简单的GTK3 C应用程序,其中包含按钮和GtkDrawingArea(与GtkPaned结合在一起)。当按下按钮时,它应该立即绘制一个矩形,但是,它不会发生。仅当鼠标在 GtkPaned 分割部分上移动时才会发生这种情况(参见 .gif)。如果不使用Glade,那么就不存在这个问题。
如何解决这个问题?
C 代码:
#include <gtk/gtk.h>
//==============================================================Global=variables========================================================================
static cairo_surface_t *surface = NULL;
GtkWidget *DrawArea;
//==============================================================Functions===============================================================================
void clear_surface (void)
{
cairo_t *cr;
cr = cairo_create (surface);
cairo_set_source_rgb (cr, 0, 1, 1);
cairo_paint (cr);
cairo_destroy (cr);
}
//Create a new surface of the appropriate size to store our scribbles
gboolean configure_event_cb (GtkWidget *widget, GdkEventConfigure *event, gpointer data)
{
if (surface)
{
cairo_surface_destroy (surface);
}
surface = gdk_window_create_similar_surface (gtk_widget_get_window (widget), CAIRO_CONTENT_COLOR, gtk_widget_get_allocated_width (widget), gtk_widget_get_allocated_height (widget));
/* Initialize the surface to white */
clear_surface ();
/* We've handled the configure event, no need for further processing. */
return TRUE;
}
/* Redraw the screen from the surface. Note that the ::draw
* signal receives a ready-to-be-used cairo_t that is already
* clipped to only draw the exposed areas of the widget
*/
gboolean draw_cb (GtkWidget *widget, cairo_t *cr, gpointer data)
{
cairo_set_source_surface (cr, surface, 0, 0);
cairo_paint (cr);
return FALSE;
}
//Draw a rectangle on the surface at the given position
void draw_brush (GtkWidget *widget, double x, double y)
{
cairo_t *cr;
/* Paint to the surface, where we store our state */
cr = cairo_create (surface);
cairo_rectangle (cr, x - 3, y - 3, 6, 6);
cairo_fill (cr);
cairo_destroy (cr);
//Now invalidate the affected region of the drawing area.
gtk_widget_queue_draw_area (widget, x - 3, y - 3, 6, 6);
}
void draw_rectangle (GtkWidget *widget, float posX, float posY, float length, float height, float colorR, float colorG, float colorB)
{
cairo_t *cr;
/* Paint to the surface, where we store our state */
cr = cairo_create (surface);
cairo_set_source_rgb (cr, colorR, colorG, colorB);
cairo_rectangle (cr, posX, posY, length, height);
cairo_fill (cr);
cairo_destroy (cr);
//Now invalidate the affected region of the drawing area.
gtk_widget_queue_draw_area (widget, posX, posY, length, height);
}
//==================================Button=stuff==========================
void Button_clicked(GtkWidget* widget, gpointer data)
{
g_print("Clicked\n");
draw_brush (DrawArea, 10, 10);
//gtk_widget_queue_draw (window_main);
}
int main(int argc, char *argv[])
{
GtkBuilder *builder;
GtkWidget *window;
gtk_init(&argc, &argv);
DrawArea = gtk_drawing_area_new ();
builder = gtk_builder_new();
gtk_builder_add_from_file (builder, "Resources/GUI_design.glade", NULL);
window = GTK_WIDGET(gtk_builder_get_object(builder, "window_main"));
gtk_builder_connect_signals(builder, NULL);
g_object_unref(builder);
gtk_widget_show(window);
gtk_main();
return 0;
}
// called when window is closed
void on_window_main_destroy()
{
gtk_main_quit();
}
林间空地代码:
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.22.1 -->
<interface>
<requires lib="gtk+" version="3.20"/>
<object class="GtkWindow" id="window_main">
<property name="can_focus">False</property>
<property name="default_width">500</property>
<property name="default_height">500</property>
<property name="icon">icon.png</property>
<signal name="destroy" handler="on_window_main_destroy" swapped="no"/>
<child type="titlebar">
<placeholder/>
</child>
<child>
<object class="GtkPaned" id="paned">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="orientation">vertical</property>
<property name="position">300</property>
<property name="position_set">True</property>
<child>
<object class="GtkDrawingArea" id="DrawArea">
<property name="visible">True</property>
<property name="can_focus">False</property>
<signal name="configure-event" handler="configure_event_cb" swapped="no"/>
<signal name="draw" handler="draw_cb" swapped="no"/>
</object>
<packing>
<property name="resize">False</property>
<property name="shrink">False</property>
</packing>
</child>
<child>
<object class="GtkButton" id="Button">
<property name="label" translatable="yes">button</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<signal name="clicked" handler="Button_clicked" swapped="no"/>
</object>
<packing>
<property name="resize">True</property>
<property name="shrink">True</property>
</packing>
</child>
</object>
</child>
</object>
</interface>
最佳答案
我终于找到并解决了问题!!!
int main 现在看起来像这样(删除了 1 行并添加了 1 行)
int main(int argc, char *argv[])
{
GtkBuilder *builder;
GtkWidget *window;
gtk_init(&argc, &argv);
//DrawArea = gtk_drawing_area_new ();
builder = gtk_builder_new();
gtk_builder_add_from_file (builder, "Resources/GUI_design.glade", NULL);
window = GTK_WIDGET(gtk_builder_get_object(builder, "window_main"));
gtk_builder_connect_signals(builder, NULL);
DrawArea = GTK_WIDGET(gtk_builder_get_object(builder, "DrawArea")); //This is very important
g_object_unref(builder);
gtk_widget_show(window);
gtk_main();
return 0;
}
描述导致此问题的原因:Glade 和我创建了 2 个单独的指针,并且我只使用我的指针执行操作,而不使用 Glade 的指针。那条重要的线将这两个指针连接在一起,现在它可以工作了。巨呼!
这个教程帮助我解决了这个问题:https://prognotes.net/2016/03/gtk-3-c-code-hello-world-tutorial-using-glade-3/
关于c - 如果使用 Glade,GtkDrawingArea 在绘制时不会更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53459739/
我正在尝试使用 Glade、PyGTK 和 Python 设置一个小的下载应用程序。我已经计划好了我想如何编写这个进度条和所有的脚本,尽管我觉得我正在以错误的方式去做,因为......好吧......
我正在尝试在 mac OSX el capan 上安装 Glade。我在 https://glade.gnome.org/sources.html 上下载了源代码 我按照源代码中带有“安装”文本的说明
我试图用glade 3.20做一个GtkHeaderBar应用程序,但每次创建我的python应用程序时,我的老学校栏都在顶部。 在glade 3.19 中,检查客户端装饰属性在顶部创建了一条线,我可
我是 gtk+ 编程领域的新手。我仍在探索许多使用选项。我将使用 C 语言进行编码。我有以下问题: 哪个更好?编写代码还是使用 glade 生成的 .glade 文件? 哪个更好用? libglade
我在 Internet 上进行了一项研究,寻找教程/文档来解释我如何在 Java Gnome 项目中使用在 Glade 中设计的 UI,但没有成功。我已经知道如何使用 Java Gnome/GTK 从
我已经阅读了一些 Glade 手册并创建了一个 GUI,其中有一个我想通过代码填充的 TreeView。空地文件是: False 3 Tree Viewe
我正在使用带有 gtk2hs 绑定(bind)的编辑器 Glade 在 Haskell 中编写 GUI。目前,我在对单选按钮进行分组时失败了。它不会让我选择组名。有人可以帮忙吗? 最佳答案 对于组中的
Glade:如何将多个参数传递给信号处理程序? 最佳答案 你在林间空地能做的事情非常有限。您可以将零个或一个对象作为用户数据传递给信号处理程序。该对象必须是一个小部件(或其他对象),也存在于 glad
我正在尝试使用 Glade/gtk/vala 制作一个简单的应用程序。到目前为止,我有这个: using Gtk; class HelloWorldApp : GLib.Object { co
我正在使用代码块和空地编写一个 C 程序。起初我以为问题出在我的代码上。我尝试了在网上找到的不使用glade(仅GTK)的示例代码,并且它有效。然后我尝试了一个只有一个窗口和一个 TextView 的
如果我在 FreeBSD 8 下静态链接 GTK+ 程序,gtk_builder_add_from_file() 突然返回错误: Invalid object type `GtkWindow' 如何解
Glade 3.14.2 似乎打开了我的 .glade 文件,但没有显示任何内容。我可以在文本编辑器中查看所有 xml 详细信息。我的 .glade 文件中的 header 是:
我正在尝试将 Glade 3 用于我在 Windows 7 上的 Ada 程序。我找到了 3.6 版的方法,但 gtk-builder-convert 未被识别为脚本。我已经尝试通过 Google 找
如何将对话窗口的按钮(例如 GtkDialog)与响应 Gtk::ResponseType 链接起来值(value)与格莱德?。 我知道如何以编程方式执行此操作,但我不知道如何使用 Glade 执行此
我正在 Glade (GTK# 3.20 + C#) 中制作应用程序界面原型(prototype),并通过 CssProvider 使用我的 CSS 样式。我有这个: 问题是我使用 GTKLayout
您好,我正在使用 gtk3 和 Glade 3.14...我想向 Glade 添加一个自定义小部件,以便我可以轻松地将其添加到我的用户界面中。 我发现空地中缺少旋钮小部件,我在其中找到了旋钮小部件 h
我想多次显示在 Glade 文件中定义的 Gtk.Dialog。 目前,我可以使用自定义按钮来调用对话框的 hide() 方法,但是,如果用户使用 Alt+F4 关闭对话框,它重新打开为空: 在控制台
首先,我是编程语言世界的新手,当然对 Python 也很陌生。 在我的工作中,我们使用 Linux 系统。我有时需要检查终端上的一些命令和脚本输出。因此,我想使用非常基本的 GUI 编写一个小型应用程
我想处理菜单单击事件,但是,正在发生此丢失处理程序警告,我哪里错了?我将信号 ab 与处理程序 abcd 连接在 menuitem6 上,在激活事件上,处理点击事件是否正确? 这是错误: abc.py
我使用glade构建了一个数据库操作GUI,对于我的添加按钮层次结构是添加->确认对话框->(如果是)添加数据。如何访问主窗体中的每个小部件值?我是 gtk 和glade 的新手,我设法消除了大部分错
我是一名优秀的程序员,十分优秀!