2016-05-28 10 views
1

gtkmmで作成した簡単なgtk +アプリケーションがあります。ボタンを押すとウィンドウの内容を変更したいので、そのコードを別のファイル(changeTitle.cc)に入れたいと思います。そのファイルから「ボタン」オブジェクトにアクセスするにはどうすればよいですか?他のファイルからGTKMMウィジェットにアクセスするには?

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

答えて

0

これは全くgtkmmに固有ではありません。複雑なライブラリを数式に入れて水域を泥だらけにする前に、オブジェクトスコープの把握を改善するためのシンプルで非GUIの例が役立つのだろうかと思います。

問題

main()内を除き、直接どこからでもbuttonsへのアクセスは、あなたの現在のアーキテクチャで行うことはできません。buttonsは、有効範囲がmain()のローカルオブジェクトです。他の機能には使用できません。他の翻訳単位(基本的にはファイル)を気にする必要はありません。つまり、名前で参照するだけでは意味がありません。あなたがそれらを使用したい場合は、それらに渡すか、そうでなければ範囲を緩めるなどして、それを引き出すことができます。

[コードを正しくインデントすると、スコープの問題を含めて視覚的に視覚的にわかりやすくなります。 ]

だから、ソリューション

、オブジェクトaを作るbuttons他のスコープのオブジェクトと同じように、あなたは、それを使用するすべての関数にオブジェクトを渡すに必要どちらかclass内のすべてのこのような機能をつけてメンバー変数、または - は、考えを破る - グローバル変数を使用します。

最も簡単なオプションは、右のあなたのsignal-clickedハンドラ内であなたの「変更タイトル」ロジックを置くことがButtons現在thisインスタンスにアクセスさせて頂いており(本当にWindow S;あなたが選択した混乱の名前を) - 手際よく、です、 実際にはGtk::Buttonとなっています。changeTitle()を無料の機能として残して、特定のものを参照しようとした理由はありますか?のインスタンスはButtonsですか?あなたはこれを行うことができれば

は、あなたが複数のButtons ESを作成したと言う - main()異なるButtonsインスタンスchangeTitle()を呼ぶだろうどののボタンをクリック- のは彼ら、B、およびCを呼びましょう...奇妙に思える。クラスメンバーの定義は、わからない場合は、複数のソースファイルに分割することができます。

明らかに、いくつかの再設計が必要です。どのオプションを選択するかは、プログラムとそのデータをどのように整理するかによって決まります。これが正しい軌道にない場合は、さらにあなたが望むものを説明する必要があります。

そして私はそれを言うだろう:グローバル変数を使用しないでください...あなたが非常に良い正当性を持っているない限り。いくつかありますが、多くはありません。彼らは多くの人々が作るほど悪くはありませんが、診断とメンテナンスの頭痛のために開かれる危険性があります。彼らは最初の選択肢ではありません。

無所属噴出

ところで、私はgtkmmを愛し、十分にそれを促進することはできません。素晴らしいステアリングを備えた素晴らしいプロジェクトです。私は大規模な「コミュニティ」で悲観的に知られていないと思います。しかしここでも簡単なオブジェクトのスコープである基本的な問題とは直交しています。

関連する問題