0

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

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

主文件

#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);
}

窗口.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;
}

窗口.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但我还没有让它工作,也不知道如何继续。

4

1 回答 1

0

首先有 gtkmm3教程

那里

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

所以你需要这样的东西

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

附带说明:

如果您对指针有疑问,您可以尝试智能指针,但老实说,我认为您最好理解它们。

于 2016-08-04T14:15:42.113 回答