我有一个用 gtkmm 制作的简单 gtk+ 应用程序,我想在按下按钮时更改窗口的内容,我想将该代码放在一个单独的文件 (changeTitle.cc) 中。如何从该文件访问“按钮”对象?
主.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);
}
按钮.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
按钮.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
s;您选择的名称令人困惑)- 方便地,与 actual Gtk::Button
相同发出了点击。 你离开的原因是什么 changeTitle()
作为一个自由函数,它试图引用一个特定的、其他 Buttons
实例?
如果您可以这样做,假设您创建了多个 Buttons
es - 让我们称它们为 A、B 和 C - 单击 any 中的按钮将调用 changeTitle()
在不同 Buttons
main()
中的实例 ……这看起来很奇怪。顺便说一句,如果您不知道的话,您可以将类成员定义拆分到多个源文件中。
因此,很明显,需要进行一些重新设计。您选择这些选项中的哪一个取决于您希望如何组织程序及其数据。如果这些都不在正确的轨道上,那么您需要进一步解释您想要什么。
我要说的是:不要使用全局变量...除非您有非常很好的理由。有一些,但不是很多。它们并不像很多人认为的那么糟糕,但是由于诊断和维护方面的麻烦,它们可能会打开,如果没有充分的理由,您也不应该使用它们;他们不应该是第一选择。
独立涌出
顺便说一句,我喜欢gtkmm
, 宣传不够。这是一个非常棒的项目,具有很好的指导性,我认为在更大的“社区”中,这可悲地无人问津。但同样,它与这里的基本问题是正交的,这是简单的对象范围。
关于c++ - 如何从其他文件访问 GTKMM 小部件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37497698/