GtkMM将Char作为按钮回调中的参数传递

时间:2016-04-07 22:59:34

标签: user-interface callback gtkmm3

有一个类似的问题,但它没有回答我的问题。我正在使用GTKMM开发GUI。我试图在我的按钮的回调中传递一个字符。

然后将此字母分配给全局变量letter。但是,我不明白指针,并试图让这个工作很长一段时间没有成功。

的main.cpp

#include <gtkmm.h>
#include "window.h"

int main(int argc, char *argv[])
{
    Glib::RefPtr<Gtk::Application> app = Gtk::Application::create(argc, argv, "com.gtkmm.tutorial3.base");

    mywindow window;

    return app->run(window);
}

window.cpp

#include "window.h"

mywindow::mywindow()
{
    set_default_size(480, 320);
    set_title("Transfer");
    Gtk::Box *vbox = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_VERTICAL, 0));
    add(*vbox);

    Gtk::Grid *grid = Gtk::manage(new Gtk::Grid);
    grid->set_border_width(10);
    vbox->add(*grid);

    Gtk::Button *a = Gtk::manage(new Gtk::Button("A"));
    //a->set_hexpand(true);
    //a->set_vexpand(true);//%%%%%%%% next line is the issue%%%%%%%%%
    a->signal_clicked().connect(sigc::mem_fun(*this, &mywindow::on_click('a')));
    grid->attach(*a, 0, 0, 1, 1);//x=0,y=0, span 1 wide, and 1 tall

    Gtk::Button *b = Gtk::manage(new Gtk::Button("B"));
    //b->set_hexpand(true);
    //b->set_vexpand(true);
    b->signal_clicked().connect(sigc::mem_fun(*this, &mywindow::on_click('b')));
    grid->attach(*b, 1, 0, 1, 1);

    Gtk::Button *c = Gtk::manage(new Gtk::Button("C"));
    //c->set_hexpand(true);
    //c->set_vexpand(true);
    c->signal_clicked().connect(sigc::mem_fun(*this, &mywindow::on_click('c')));
    grid->attach(*c, 2, 0, 1, 1);

    vbox->show_all();
}

mywindow::~mywindow()
{
    //dtor
}

void mywindow::on_click(char l)
{
    letter = l;
}

window.h中

#ifndef MYWINDOW_H
#define MYWINDOW_H

#include <gtkmm.h>

class mywindow : public Gtk::Window
{
    public:
        mywindow();
        virtual ~mywindow();
    protected:
        char letter;//global variable where the letter is stored
        char on_click(char l);
    private:
};
#endif // MYWINDOW_H

我尝试用*替换pointer &,反之亦然mywindow,但我没有让它工作,也不知道怎么做继续进行。

1 个答案:

答案 0 :(得分:0)

首先是gtkmm3 tutorial

来自there

  

你不能将一个带有两个参数的函数挂钩到一个期望没有的信号(当然,除非你使用了一个适配器,比如sigc :: bind())。

所以你需要像this这样的东西:

 c->signal_clicked().connect(sigc::bind<char>(sigc::mem_fun(*this,&mywindow::on_click), "c"));

旁注:

如果您有指针问题,可以尝试smart pointers,但说实话,我认为理解它们会更好。