【问题标题】:How to use GTK signals?如何使用 GTK 信号?
【发布时间】:2015-04-26 10:18:44
【问题描述】:

我是GTK 的新手,我来自Qt 背景。我试图弄清楚信号在GTK 中是如何工作的,我试图发出一个信号,但它不起作用。令我惊讶的是,我找不到一个像样的代码示例,它发出一个有效的GTK 信号。这是我目前的代码(我正在使用Qt Creator):

Test_Gtk.pro

#-------------------------------------------------
#
# Project created by QtCreator 2015-04-26T12:42:38
#
#-------------------------------------------------

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = Test_Gtk
TEMPLATE = app

SOURCES += main.cpp \
    myfirstobject.cpp \
    mysecondobject.cpp


HEADERS += \
    myfirstobject.h \
    mysecondobject.h

unix:!macx{
    # Make sure you install libappindicator-dev
    INCLUDEPATH += /usr/include/glib-2.0
    INCLUDEPATH += /usr/include/gtk-2.0
    INCLUDEPATH += /usr/lib/x86_64-linux-gnu/glib-2.0/include
    INCLUDEPATH += /usr/lib/x86_64-linux-gnu/gtk-2.0/include
    INCLUDEPATH += /usr/include/cairo
    INCLUDEPATH += /usr/include/pango-1.0
    INCLUDEPATH += /usr/include/gdk-pixbuf-2.0
    INCLUDEPATH += /usr/include/atk-1.0

    LIBS += -L/usr/lib/x86_64-linux-gnu -lgobject-2.0
    LIBS += -L/usr/lib/x86_64-linux-gnu -lgtk-x11-2.0
}

myfirstobject.h

#ifndef MYFIRSTOBJECT_H
#define MYFIRSTOBJECT_H

#include <QObject>

#ifdef Q_OS_LINUX
#undef signals
extern "C" {
    #include <gtk/gtk.h>
}
#define signals public
#endif

class MyFirstObject : public GObject
{
public:
    MyFirstObject();
    ~MyFirstObject();

    void emitMySignal();
};

#endif // MYFIRSTOBJECT_H

myfirstobject.cpp

#include "myfirstobject.h"

MyFirstObject::MyFirstObject()
{
    g_signal_new("my-signal",
                 G_TYPE_OBJECT, G_SIGNAL_RUN_FIRST,
                 0, NULL, NULL,
                 g_cclosure_marshal_VOID__POINTER,
                 G_TYPE_NONE, 1, G_TYPE_POINTER);
}

MyFirstObject::~MyFirstObject()
{

}

void MyFirstObject::emitMySignal()
{
    g_signal_emit_by_name (this, "my-signal");
}

mysecondobject.h

#ifndef MYSECONDOBJECT_H
#define MYSECONDOBJECT_H

#include <QObject>

#ifdef Q_OS_LINUX
#undef signals
extern "C" {
    #include <gtk/gtk.h>
}
#define signals public
#endif

class MyFirstObject;

class MySecondObject : public GObject
{
public:
    MySecondObject(MyFirstObject *obj);
    ~MySecondObject();

    void mySlot();

private:
    MyFirstObject *m_obj;
};

#endif // MYSECONDOBJECT_H

mysecondobject.cpp

#include "mysecondobject.h"
#include "myfirstobject.h"

#include <QDebug>

MySecondObject::MySecondObject(MyFirstObject *obj) : m_obj(obj)
{
    g_signal_connect(m_obj, "my-signal", G_CALLBACK(&MySecondObject::mySlot), 0);
}

MySecondObject::~MySecondObject()
{

}

void MySecondObject::mySlot()
{
    qDebug() << "mySlot was called";
}

main.cpp

#include <QCoreApplication>

#include "myfirstobject.h"
#include "mysecondobject.h"

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    MyFirstObject *o1 = new MyFirstObject;
    MySecondObject *o2 = new MySecondObject(o1);
    o1->emitMySignal();

    return a.exec();
}

代码很简单。我从MyFirstObject 发出一个信号,我希望在MySecondObject 中调用一个回调。问题是回调永远不会被调用。你能告诉我我做错了什么吗?有没有对GTK信号很好的解释或者一些代码示例的地方?

据我目前所知,GTK 中的GObject 类似于Qt 中的QObjectGTK 中的GtkObject 类似于Qt 中的QWidget。这是真的吗?

【问题讨论】:

  • 你应该忘记 GtkObject:它已经被弃用了很长时间,GTK+ 中的对象实际上只是 GObjects(小部件也是 GtkWidgets)。 gtk_signal_* API 也是如此:它确实存在了很短的时间,但现在 GTK+ 中的信号只是 GObject 信号。
  • @jku 非常感谢您提供的信息,您为我澄清了那部分!任何线索我在信号部分做错了什么?
  • 由于我缺乏对 C++ 的理解,我真的不想去那里......但我从没想过 class MyFirstObject : public GObject 能正常工作。 GObject 不是 C++ 类,那么你怎么能从它继承 C++ 类呢?如果你真的想在 GTK 中使用 C++,你可能想看看 gtkmm 项目:.gtkmm.org/en
  • @jku 我希望至少有一个简单的GTK 信号工作示例,所以可以在网络上的某个地方......来自一个记录良好的框架,如Qt,这非常令人沮丧我来学习这些东西,它们是你用框架做的最简单的事情......
  • 仅在 git.gnome.org 中就有数以千计的信号注册示例in C——毕竟 GObject 被广泛使用。缺少高质量的 GObject 教程,这是非常正确的:the official one 已过时并且不是很好。也就是说......尝试使用普通 C++ 类实现 GObject 可能会像尝试仅使用 GObject 和 C 实现 C++ 类一样痛苦——这没有多大意义。

标签: c++ qt gtk glib gobject


【解决方案1】:

gtkmm 教程推荐使用 libsigc++ 从 C++ 代码创建信号; gtkmm 在内部使用 libsigc++ 将 C 中定义的信号封装在 GTK+ 本身中。

https://developer.gnome.org/gtkmm-tutorial/stable/chapter-custom-signals.html.en

还提供了一个(此处过于冗长无法复制)示例:https://developer.gnome.org/gtkmm-tutorial/stable/chapter-custom-signals-example.html.en

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多