Как использовать сигналы GTK?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как использовать сигналы GTK?

Сообщение Anonymous »

Я новичок в 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 

#ifdef Q_OS_LINUX
#undef signals
extern "C" {
#include 
}
#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");
}
my Secondobject.h:

Код: Выделить всё

#ifndef MYSECONDOBJECT_H
#define MYSECONDOBJECT_H

#include 

#ifdef Q_OS_LINUX
#undef signals
extern "C" {
#include 
}
#define signals public
#endif

class MyFirstObject;

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

void mySlot();

private:
MyFirstObject *m_obj;
};

#endif // MYSECONDOBJECT_H
my Secondobject.cpp:

Код: Выделить всё

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

#include 

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() emitMySignal();

return a.exec();
}
Код прост. Я посылаю сигнал из MyFirstObject и ожидаю, что обратный вызов будет вызван в MySecondObject. Проблема в том, что обратный вызов никогда не вызывается. Подскажите, пожалуйста, что я делаю не так? Есть ли место, где хорошо объясняются сигналы GTK или приведены примеры кода?

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

Подробнее здесь: https://stackoverflow.com/questions/298 ... tk-signals
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»