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

标签 c++ gtk gtkmm

我有一个用 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() 以外的任何地方无法用您当前的架构完成。 buttonsmain() 范围内的本地对象.它不适用于任何其他功能,更不用说任何其他翻译单元(基本上是文件)——我的意思是他们不能只通过名称来引用它。如果你想让他们使用它,你必须将它传递给他们,或者放宽它的范围,以便他们可以拉动它……接下来会详细介绍。

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

解决方案

因此,使用 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/

相关文章:

gtk - GTK在哪里找到要与gtk_image_new_from_icon_name()一起使用的图标名称?

c++ - gtkmm Append_column(TreeViewColumn) 不显示任何内容

c++ - 使用 Glade 和 gtkmm 对 GTK+ 对象进行内存管理

c++ - 函数总是返回 1

c++ - 如何使用 GTK 信号?

在linux中从tar.gz创建exe文件

c++ - wxwidgets 与 gtkmm 符合我的要求

c++ - 如何为内部类声明运算符<<

c++ - 从控制台 C++ 读取已输入的行

c++ - 在 DLL 客户端中使用 dllimport 时出错