我有一个使用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);

}

button.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

button.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");
}

最佳答案

这一点完全不针对gtkmm我想知道您是否可以从一些简单的,非GUI的示例中受益,以改善对对象范围的了解,然后再将复杂的库引入方程式中以解决问题。

问题

使用您当前的体系结构无法直接从buttons内的任何地方访问main() buttons是范围为main()的本地对象。它对任何其他功能均不可用,不要介意任何其他翻译单元(基本上是文件)-我的意思是他们不能仅按名称引用它。如果您希望他们使用它,则必须将其传递给他们,否则,请放宽其范围,以便他们可以拉动它...接下来的更多内容。

[正确缩进代码可能会帮助您更直观地查看内容,包括范围问题。 ]



因此,将buttons与任何其他作用域对象一起使用,您要么需要将对象传递给使用该对象的任何函数,然后将所有此类函数放入class中,然后使该对象成为成员变量,或者-使思想落伍-使用全局变量。

最简单的选择是将“更改标题”逻辑放到signal-clicked处理程序中,让它访问this (实际上是Buttons;您选择的名称易混淆)的当前Window实例-方便地,与实际的相同Gtk::Button发出了点击。 您是否有理由将changeTitle()保留为自由功能,该功能尝试引用Buttons的一个特定实例,另一个实例?

如果可以执行此操作,则说您创建了多个Buttons es-称它们为A,B和C-单击任何按钮都会在changeTitle()中的另一个Buttons实例上调用main()……似乎很奇怪。顺便说一下,如果您不知道,您可以在多个源文件中拆分类成员定义。

因此,显然,需要重新设计。选择哪种选项取决于您希望程序及其数据的组织方式。如果所有这些都不在正确的轨道上,那么您需要进一步解释您想要什么。

我会说:不要使用全局变量...除非您有很好的理由。有一些,但不是很多。它们并没有很多人认为的那么糟糕,但是由于诊断和维护上的麻烦,它们冒着开放的风险,也不要在没有充分理由的情况下使用它。他们不应该是第一选择。

非附属涌出

顺便说一句,我爱gtkmm,不能推广它。这是一个很棒的项目,具有很好的指导性,我认为在较大的“社区”中,这是可悲的。但同样,它与这里的基本问题正交,即简单的对象作用域。

关于c++ - 如何从其他文件访问GTKMM窗口小部件?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37497698/

10-11 06:22