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