【问题标题】:How can I connect a Gtkmm signal to a fuction in another class?如何将 Gtkmm 信号连接到另一个类中的函数?
【发布时间】:2019-01-22 15:55:53
【问题描述】:

我是 C++ 和 Gtkmm3 的新手。我需要在另一个类中设置信号,如果不使用小部件类中的函数加载类,我将如何做到这一点。

我不想在ButtonBox中重新加载整个FixedLayout

在 ButtonBox 类中 我不想要

FixedLayout instance;
instance.move_widget();

下面是我的代码

layout.cpp

#include "layout.h"
#include <iostream>

FixedLayout::FixedLayout()
{
    fixed.put(box, 0, 0);
    add(fixed);
}

void FixedLayout::move_widget(int x, int y)
{
    fixed.move(*fixed.get_focus_child(), x, y);
}

ButtonBox::ButtonBox()
{
    set_size_request(320, 480);
    header.set_size_request(-1, 24);
    body.set_size_request(-1, 456);
    pack_start(header);
    dragger = Gtk::GestureDrag::create(header);
    dragger->set_button(GDK_BUTTON_PRIMARY);
    dragger->set_propagation_phase(Gtk::PHASE_BUBBLE);
    dragger->signal_drag_update().connect(sigc::mem_fun(*this, &ButtonBox::update_drag));
    pack_end(body);
}

void ButtonBox::update_drag(bool x, bool y)
{
    FixedLayout::move_widget(x, y);
}

布局.h

#ifndef FIXEDLAYOUT_H
#define FIXEDLAYOUT_H

#include <gtkmm.h>

class ButtonBox: public Gtk::VBox
{
    public:
    ButtonBox();

    protected:
        Gtk::Button header{"Header"}, body{"Body"};
        Glib::RefPtr<Gtk::GestureDrag> dragger;
        void update_drag(bool x, bool y);

    private:
};

class FixedLayout: public Gtk::ScrolledWindow
{
    public:
       FixedLayout();
        //virtual ~bar();

    protected:
        void move_widget(int x, int y);
        Gtk::Fixed fixed;
        ButtonBox box;

    private:
};

#endif // FIXEDLAYOUT_H

【问题讨论】:

    标签: c++ gtkmm3


    【解决方案1】:
    dragger->signal_drag_update().connect(sigc::mem_fun(*this, &ButtonBox::update_drag));
    

    这是将信号连接到回调方法的方法。 this 是指向类的实际实例的指针。那么如何连接到另一个类的实例呢?

    使用指针

    如果您需要将信号连接到另一个类实例的方法,则需要提供指向该实例的指针而不是this。有点像:

    signal().connect(sigc::mem_fun(*p, &::callback_name));
    

    这里的p 是一个通用指针,让它成为你的类的一个属性。请注意,这会使两个类相互依赖,因此如果您想让代码可重用,这通常不是一个好主意。

    在您的情况下,您需要在ButtonBox 中放置一个指向FixedLayout 实例的指针。

    class ButtonBox: public Gtk::VBox
    {
        private: #could be whatever
        FixedLayout *ptofl;
    
    };
    

    在你的构造函数中:

    whatever_signal().connect(sigc::mem_fun(*ptofl, &FixedLayout::name_of_the_method));
    

    继承

    另一种方法是让ButtonBox 成为FixedLayout 的子代:

    class ButtonBox: public Gtk::VBox, public FixedLayout
    

    您需要颠倒这两个类的顺序定义。然后从ButtonBox,您可以访问FixedLayout 的受保护和公共方法,并且在您的代码中,您只能使用ButtonBox 实例。将信号连接到回调时,您可以照常使用this 指针。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-02
      相关资源
      最近更新 更多