GObject类A实现接口IA,B是A的派生类.B如何覆盖作为接口IA一部分的A方法?
或者,这在GObject中是否可行?
我知道如何覆盖父类方法,但是当继承符合接口时,事情似乎更复杂.
非常感谢!
我正在使用libnotify在我的应用程序中显示桌面通知; notify_notification_new() 返回a NotifyNotification*,应作为第一个参数传递给通知库的进一步函数调用.
没有notify_notification_free()哪个可以释放它返回的指针.我查找源代码notify_notification_new()并在内部执行a g_object_new(),获取GObject*并将其作为a返回NotfiyNotification*,因此当我的应用程序执行清理时,是否应该调用g_object_unref()返回的指针notify_notification_new()?
当我运行我的GTK(Python GObject内省)应用程序时,我有一个警告,我无法弄清楚它的来源.当应用程序加载并且我正在填充GtkListStore时,在我第一次添加行之后,我收到以下警告:
/usr/lib/python2.7/site-packages/gi/types.py:44: Warning: g_object_set_qdata: assertion `G_IS_OBJECT (object)' failed
return info.invoke(*args)
Run Code Online (Sandbox Code Playgroud)
其余的行追加而没有任何进一步的警告.实际上,它总是只被提升一次,总是在第一个要追加的项目上.但是,该行的实际内容似乎并不重要; 它无论如何都会提出警告.当程序完成加载时,当我在TreeView中浏览它们时,所有行似乎都没问题.
我的列表商店看起来像这样:
self.list_store = Gtk.ListStore(bool, str, str, str, str, str, str,
str, str, str, str, GdkPixbuf.Pixbuf,
str, str, str, object, Pango.Weight)
Run Code Online (Sandbox Code Playgroud)
最后几列是从关联的GtkTreeView中隐藏的,但警告发生在TreeView创建之前,所以我确定它来自ListStore.Needless说,我确信我传递的所有行都在正确的格式,因为,就像我说的那样,警告总是在第一行之后引发,无论我先添加哪一行.
有谁知道是什么原因引起的?它并没有阻止我的应用程序运行,所以它不是紧急情况,但我宁愿不让它为最终用户吐出警告.
编辑:我确认使用Python的-W all命令行参数,实际上是为所有行引发了警告.
我尝试append()使用pdb但是,gi当它尝试设置包含GdkPixbuf的列的值时,它会陷入代码循环中,所以我从未真正看到调试程序时出现的警告.我的猜测是Pixbuf导致问题,但我不知道如何更改它以摆脱警告.Pixbuf在TreeView中正确呈现,所以我不确定发生了什么.
它为面向对象语言(如C++)提供了什么?或者没有它可以使用GTK +?
GObject假设两个示例使用相同的编译器,对象的实现在可执行文件的大小和速度方面是否与C++ 的实现质量相似?或者是否存在一些权衡取舍,GObject因为它提供了额外的功能?
看看这个琐碎的python gobject程序:
import threading
import gobject
import time
def f():
while True:
print "HELLO"
time.sleep(1)
threading.Thread(target=f).start()
gobject.MainLoop().run()
Run Code Online (Sandbox Code Playgroud)
它产生一个每秒输出"HELLO"的线程,然后进入gobject主循环.问题是它实际上没有做任何事情.为什么?
$ python a.py
[...]
Run Code Online (Sandbox Code Playgroud)
但是,如果我按CTRL + C,它就会开始工作.此外,删除程序(gobject.MainLoop().run())中的最后一行使它工作.为什么?
$ python a.py
^CTraceback (most recent call last):
File "a.py", line 11, in <module>
gobject.MainLoop().run()
KeyboardInterruptHELLO
HELLO
HELLO
HELLO
[...]
Run Code Online (Sandbox Code Playgroud)
看看第二个程序,它与第一个程序完全相同,只是它告诉gobject g每秒运行一次该函数.这种类型的工作,生成的线程每隔一段时间运行一次,而不是永远.为什么?
import threading
import gobject
import time
def f():
while True:
print "HELLO"
time.sleep(1)
threading.Thread(target=f).start()
def g():
print "yo"
return True
gobject.timeout_add_seconds(1, g)
gobject.MainLoop().run()
Run Code Online (Sandbox Code Playgroud)
运行它:
$ python b.py
HELLOyo
yo
yo …Run Code Online (Sandbox Code Playgroud) 你知道如何在GTK 3中创建自定义小部件吗?我试图在C中继承GtkDrawingArea几个小时.Gnome.org仅提供了关于如何子类化G_OBJECT的简明教程.我的问题是,G_Object/ GTK没有查看我的自定义StrokerNodalContainer为的一个子类GtkWidget与铸造时GTK_WIDGET,甚至强硬我的定义struct包含了这样一行:
GtkDrawingArea parent_instance;
Run Code Online (Sandbox Code Playgroud)
它说 :
invalid cast from 'StrokerNodalContainer' to 'GtkWidget'
Run Code Online (Sandbox Code Playgroud)
如果您怀疑其他可能有问题,请输入完整的代码.它是最小的所以我没有看到外部代码搞乱的任何理由.
司炉,nodalcontainer.h
#ifndef __STROKER_NODALCONTAINER_H__
#define __STROKER_NODALCONTAINER_H__
#ifndef NO_INCLUDE_WITHIN_HEADERS
#include <gtk/gtk.h>
#endif
#define STROKER_TYPE_NODAL_CONTAINER (stroker_nodal_container_get_type ())
#define STROKER_NODAL_CONTAINER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), STROKER_TYPE_NODAL_CONTAINER, StrokerNodalContainer))
#define STROKER_NODAL_CONTAINER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), STROKER_TYPE_NODAL_CONTAINER, StrokerNodalContainerClass))
#define STROKER_IS_NODAL_CONTAINER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), STROKER_TYPE_NODAL_CONTAINER))
#define STROKER_IS_NODAL_CONTAINER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), STROKER_TYPE_NODAL_CONTAINER))
#define STROKER_NODAL_CONTAINER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), STROKER_TYPE_NODAL_CONTAINER, StrokerNodalContainerClass))
typedef struct _StrokerNodalContainer StrokerNodalContainer;
typedef struct _StrokerNodalContainerClass StrokerNodalContainerClass;
struct _StrokerNodalContainer
{
GtkDrawingArea parent_instance; …Run Code Online (Sandbox Code Playgroud) 现在有没有人可以找到一些关于 gtk/glib 网络的好的教程/代码示例。我正在尝试编写一个客户端应用程序,该应用程序连接到一个简单的服务器,该服务器使用 Gtk2 回显它接收到的内容,但我不知道如何去做。我想在不使用线程的情况下进行异步读/写,但我不确定什么是最好的方法。API 参考没有太大帮助 - GIOChannel、GIOStream、GSocketClient 等 - 使用哪一个?
回退是在另一个线程中使用阻塞 IO。
我对便携性不感兴趣。
“咆哮:GTk / GLib 开发人员如何期望人们在没有良好文档的情况下使用他们的框架?当我可以使用 QT 来做时,我为什么还要费心。我不想学习更多的 C,这就是我费心的原因!”
我经常看到GObject库与类似COM-Windows的解决方案相比,总的来说,我并没有真正得到这个框架应该解决的问题,以及它们采用的好处是什么.
我找到了一些小答案,比如"它是一个轻松将C libs移植到其他语言的包装器",但是GObject还提供其他功能,比如信号/插槽机制,还有其他相关内容,但我老实说并没有得到大局对这个.
你能用简单的古英语解释一下吗?
据我所知,Range基于any的小部件的行为是由一个定义的Adjustements。
由于似乎没有官方方法将范围限制为几个离散值,因此我尝试了很多方法来实际重置这些值。
有效但不是最优的方法是简单地获取当前值并确定哪个有效离散值与该连续值最接近并使用它。
但我想要的是在视觉上将滑块冻结到其当前位置,直到用户将其抓住足够远,然后立即将其值更改为下一个有效值。
我希望用户理解并感觉到这些是离散值。我上面的工作解决方案的问题是测试该程序的 3 个用户告诉我应该在我显示的数字中放入更多数字,认为变化是连续的。
注意:通过“官方”,我的意思是“隐藏”选项或类的子Adjustements类(如果有的话)。如果没有,任何合理有效的方式来实现这样的要求(即不使用 50% 的 CPU 来实现一个简单的滑块!)。特别是,我不是要求“终极最佳方式”来做到这一点。