2015-04-26 4 views
0

Я новичок в GTK и я иду с фона Qt. Я пытаюсь понять, как сигналы работают в GTK, и я пытаюсь испустить один, но он не работает. Мне было удивительно, что я не смог найти достойный пример кода, который испускает сигнал GTK, который работает. Это мой код до сих пор (я использую Qt Creator):Как использовать сигналы GTK?

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 или примеры кода?

Насколько я узнал до сих пор GObject в GTK походит QObject в Qt и GtkObject в GTK, как QWidget в Qt. Это правда?

+0

Вы должны забыть GtkObject: это было устаревшим в течение длительного времени и объектов в GTK + на самом деле просто GObjects (виджеты также GtkWidgets). То же самое касается API 'gtk_signal_ *': он существовал в течение короткого времени, но теперь сигналы в GTK + являются только сигналами GObject. – jku

+0

@jku Большое спасибо за информацию, вы прояснили эту часть для меня! Любая подсказка, что я делаю неправильно с сигнальной частью? –

+1

На самом деле я не хотел идти туда с моим отсутствием понимания на С ++ ... но я никогда не ожидал, что 'класс MyFirstObject: public GObject' будет просто работать. GObject не является классом C++, так как вы можете просто наследовать класс C++? Возможно, вам стоит взглянуть на проект gtkmm, если вы действительно хотите использовать C++ с GTK: .http: //www.gtkmm.org/en/. – jku

ответ

1

В руководстве gtkmm рекомендуется использовать libsigC++ для создания сигналов из кода на C++; gtkmm использует libsigC++ внутри, чтобы обернуть сигналы, которые определены в C в GTK +.

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

A (слишком многословным, чтобы скопировать здесь) пример предоставляется также: https://developer.gnome.org/gtkmm-tutorial/stable/chapter-custom-signals-example.html.en

Смежные вопросы