如何从其他文件访问GTKMM小部件?

时间:2016-05-28 10:08:56

标签: c++ gtk gtkmm

我有一个用gtkmm制作的简单的gtk +应用程序,我想在按下按钮时更改窗口的内容,并且我想将该代码放在一个单独的文件中(changeTitle.cc)。如何访问"按钮"该文件中的对象?

main.cc:

#include <iostream>
#include "buttons.h"
#include <gtkmm/application.h>

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

Buttons buttons;


return app->run(buttons);

}

buttons.h:

#ifndef GTKMM_EXAMPLE_BUTTONS_H
#define GTKMM_EXAMPLE_BUTTONS_H

#include <gtkmm/window.h>
#include <gtkmm/button.h>
#include <gtkmm/box.h>

class Buttons : public Gtk::Window
{
public:
Buttons();

virtual ~Buttons();

protected:
//Signal handlers:
void on_button_clicked();

//Child widgets:
Gtk::Button m_button;
Gtk::Box buttonBox;
};

#endif //GTKMM_EXAMPLE_BUTTONS_H  

buttons.cc:

#include <iostream>
#include <stdlib.h>
#include "buttons.h"
#include "changeTitle.h"

Buttons::Buttons()
{
m_button.add_pixlabel("info.xpm", "click here");

set_title("Menu");
set_border_width(10);

m_button.signal_clicked().connect( sigc::mem_fun(*this,
          &Buttons::on_button_clicked) );

add(buttonBox);

buttonBox.pack_start(m_button);

show_all_children();
}

Buttons::~Buttons()
{

}

void Buttons::on_button_clicked()
{
changeTitle();
}

changeTitle.h:

void changeTitle();

changeTitle.cc:

#include "changeTitle.h"

void changeTitle()
{
    buttons.set_title("new title");
}

1 个答案:

答案 0 :(得分:1)

这根本不是gtkmm特有的。我想知道你是否会受益于一些简单的非GUI示例来提高你对对象范围的掌握程度将复杂的图书馆纳入泥泞的水域。

问题

使用您当前的体系结构无法直接从buttons内的任何位置访问main() buttonsmain()范围内的本地对象。它不适用于任何其他功能,更不用说任何其他翻译单元(基本上是文件) - 我的意思是他们不能通过名称来引用它。如果你想要它们使用它,你必须将它传递给它们,或者放宽它的范围,以便它们可以拉动它...更多关于下一个。

[正确缩进代码可能会帮助您更直观地了解事物,包括范围问题。 ]

解决方案

因此,使用buttons与任何其他范围对象一样,您需要将对象传递给使用它的任何函数,将所有此类函数放在class中和使对象成为成员变量,或 - 消灭思想 - 使用全局变量。

最简单的选择就是将您的更改标题改为#39;逻辑在你的signal-clicked处理程序中,让它访问当前 this Buttons 的实例(真的Window s;令人困惑的名字你选择了) - 其中,实际 Gtk::Button发出点击的相同。你是否有理由将changeTitle()作为一个尝试引用Buttons的一个特定其他实例的免费函数?

如果您可以这样做,请说您创建了多个Buttons es - 让他们称之为A,B和C - 点击任何会在changeTitle()中的不同的 Buttons实例上调用main() ...这看起来很奇怪。顺便说一下,如果您不知道,可以将类成员定义拆分为多个源文件。

所以,显然,需要进行一些重新设计。您选择了哪些选项取决于您希望如何组织程序及其数据。如果这些都不在正确的轨道上,那么您需要进一步解释您的需求。

我会说:不要使用全局变量...... 除非你有非常良好的理由。有一些,但不是很多。他们并没有像很多人那样糟糕,但是由于诊断和维护的麻烦,他们冒着开放的风险,也没有一个没有充分理由的人使用它;它们不应该是第一选择。

无关联的涌出

是的,我喜欢gtkmm,不能足够推广它。这是一个非常棒的转向项目,我认为这个项目在较大的社区中是非常不可思议的。但同样,它与这里的基本问题正交,这是简单的对象范围。