Вызов функции в функции обратного вызова gtk

0

Застрял на пару дней с проблемой. Я был вынужден изучить c++ для задания проекта, которое включало gtk. Мне удалось запрограммировать нужные мне окна и большинство функций, но я могу окунуться в голову, как решить задачу хранения данных из функции обратного вызова!

Прежде чем продолжить, я просто хочу добавить, что я ищу в сети ответы, но не наткнулся на ту же проблему. Я знаю, что я не могу вызвать функцию из статической функции обратного вызова

Во всяком случае, задействованы 3 основных класса (среди прочих):

  • Окно - отвечает только за виджет и записывается в буфер.
  • Клавиатура - имеет цикл, который прослушивает пользовательские входы, а также обновляет сообщения о состоянии, считывает из буфера.
  • Буфер - пользователь добавляет данные в буфер. Класс Window должен иметь возможность записывать в буфер, и клавиатура должна быть в состоянии читать.

В определенный момент при запуске программы пользователь захочет ввести новые координаты. Слушатель клавиатуры слышит, когда нажата конкретная кнопка и внутри класса, вызывается функция класса Window и отображается диалоговое окно ввода.

Window *window; //Header
....
void Keyboard::GetInputCoord(){ //.cpp
    window->display();
}

окно ссылается в Keyboard.h и связано в основном классе следующим образом:

....
keyboard.window = &window;
keyboard.buff_read = &buff;
window.buff_write = &buff;
....

У меня есть класс Window, display(), которому удалось отправить массив моих записей в статическую функцию обратного вызова, но теперь мне трудно понять, как отправить это в мой буфер? Я попытался вызвать функцию из того же класса, но бесполезно...

static void entry_coord(GtkButton *widget, GtkWidget **entry)              
{                                                                          
    GtkWidget *entry_x_in = entry[0];                                 
    GtkWidget *entry_y_in = entry[1];                                  
    const char *x, *y;                                                 

    x = gtk_entry_get_text(GTK_ENTRY(entry_x_in));                     
    y = gtk_entry_get_text(GTK_ENTRY(entry_y_in));                     

     // write_buff(x, y); <- something like this
}  

Так как я не могу назвать эту функцию, которую я объявил в Window.h и реализовал в.cpp, какие у меня есть параметры? Есть ли какие-то проблемы?

Редактировать 10 января 2015 г.

window.h

#ifndef def_Window
#define def_Window

#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <ncurses.h>
#include <gtk/gtk.h>

#include "Buffer.h"

using namespace std;

class Window
{
    public:
            Window();
            void display();
            void write_buff(const char, const char);

            Buffer *buff_write; //Sound maybe be in private
    private:

};

buffer.h

#ifndef def_buffer
#define def_buffer

#include <stdio.h>
#include <stdlib.h>
#include <string>

#define BUFF_ROW    10
#define BUFF_COL    2

using namespace std;

class Buffer
{
    public: 
            Buffer();
            void write_to_buffer(string msg);
            void read_from_buffer();
   private:
            int front, back, size, count;
            string buffer[][];
};
#endif

Keyboard.h

#ifndef def_Keyboard
#define def_Keyboard

#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <boost/filesystem.hpp>
#include <boost/thread.hpp>
#include <gtk/gtk.h>

#include "Kinematic.h"
#include "Window.h"
#include "Buffer.h"

#define MSG 10

using namespace std;

class Keyboard
{
    public:
            Keyboard();
            void UpdateMessages();
            void SetStatus(string msg);
            void SetMessage(string msg);
            string messages[10];
            int indexMsg;
            string statusString;
            ....

            Window *window;     
            Buffer *buff_read;

   private:
};

Я пробовал несколько способов записи в буфер. Я попытался вызвать функцию Buffer write_to_buffer(), и я попытался позвонить из функции Window write_buff(), которая вызывает write_to_buffer. Компилятор говорит, что функции не объявляются в этой области.

  • 0
    Что произойдет, если вы попытаетесь вызвать write_buff() таким образом? Можете ли вы предоставить хотя бы ваши заголовочные файлы?
  • 0
    Я отредактировал первый пост
Показать ещё 6 комментариев
Теги:
callback
static
gtk

1 ответ

0

Вы можете решить эту проблему, entry_coord() указатель userdata для entry_coord() что позволит вам получить доступ ко всему, что вам нужно в этой функции. Ваша идея структуры, которая имеет указатели на записи и буфер, безусловно, будет работать, но мне кажется, что ваш класс Window должен работать так же хорошо... Просто используйте this как указатель данных и сделайте обратный вызов похожим на это:

static void entry_coord(GtkButton *widget, gpointer data_ptr)
{
    auto window = static_cast<Window*> (data_ptr);
    window->update_buff_from_entries();
}

Тогда ваш класс Window, естественно, должен содержать (частные) указатели на записи, чтобы новый публичный метод update_buff_from_entries() мог получать из них значения и вызывать write_buff().

Ещё вопросы

Сообщество Overcoder
Наверх
Меню