在gtk回调函数中调用函数

时间:2015-01-10 01:06:48

标签: c++ static callback gtk

因问题困住了几天。我被迫为包含gtk的项目作业学习c ++。我已经设法编写了我想要的窗口并且大部分功能都可以,但是我可以解决如何解决从回调函数中存储数据的问题!

在我继续之前,我只是想补充一点,我已经在网上寻找答案但是却没有遇到同样的问题。我知道我无法通过静态回调函数调用函数

无论如何,涉及3个主要类别(等等):

  • Window - 仅负责小部件,并写入缓冲区。
  • 键盘 - 具有一个循环,用于侦听用户输入并更新状态消息,从缓冲区中读取。
  • 缓冲区 - 用户在缓冲区中添加数据。 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(),manged将我的条目数组发送到静态回调函数但是现在我无法弄清楚如何将它发送到我的缓冲区?我试过从同一个类调用一个函数,但没用......

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中实现的函数,我有哪些选项?有没有解决方法?

2015年1月10日编辑

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(),我尝试从调用write_to_buffer的Window函数write_buff()调用。编译器说这些函数没有在这个范围内声明。

1 个答案:

答案 0 :(得分:0)

您可以通过为entry_coord()设置userdata指针来解决此问题,该指针允许您访问该函数中所需的所有内容。您对包含条目和缓冲区指针的结构的想法肯定会有效,但在我看来,您的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()