Я новичок в 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
. Это правда?
Вы должны забыть GtkObject: это было устаревшим в течение длительного времени и объектов в GTK + на самом деле просто GObjects (виджеты также GtkWidgets). То же самое касается API 'gtk_signal_ *': он существовал в течение короткого времени, но теперь сигналы в GTK + являются только сигналами GObject. – jku
@jku Большое спасибо за информацию, вы прояснили эту часть для меня! Любая подсказка, что я делаю неправильно с сигнальной частью? –
На самом деле я не хотел идти туда с моим отсутствием понимания на С ++ ... но я никогда не ожидал, что 'класс MyFirstObject: public GObject' будет просто работать. GObject не является классом C++, так как вы можете просто наследовать класс C++? Возможно, вам стоит взглянуть на проект gtkmm, если вы действительно хотите использовать C++ с GTK: .http: //www.gtkmm.org/en/. – jku