2013-04-13 2 views
0

В моей первой программе Gtkmm 3.0 у меня возникают проблемы с структурой программы и получением доступа к моим данным класса из класса DrawingArea.Gtkmm 3.0: Как получить данные класса пользователя в методе on_draw DrawingArea

Основываясь на демонстрационной программе с сайта gnome («Рисуем тонкие линии»), у меня есть класс окна, класс drawingArea и класс Board с пользовательскими данными.

Объект drawingArea определяется как переменная-член в классе Windows. В конструкторе класса окна я создаю экземпляр объекта Board.

Теперь я хочу получить доступ к переменным члена Совета в процедуре on_draw в классе drawingArea. Каков наилучший способ сделать это?

Мой класс плата имеет:

class Board { 
public: 
    int sqPix;  

Мой класс имеет окно:

Board &ExampleWindow::getBd() { return bdw; } 
void ExampleWindow::setBd(Board b) {bdw = b; } 
ExampleWindow::ExampleWindow(char * fn, vector<int>& t) 
{ 
    Board bd = Board(t); 
    setBd(bd); 

Мое окно класса .h файл имеет:

class ExampleWindow : public Gtk::Window 
{ 
public: 
    ExampleWindow(); 
    ExampleWindow(char * fn, std::vector<int>& t); 
    virtual ~ExampleWindow(); 
    Board &getBd(); 
    void setBd(Board b); 
private: 
    Board bdw; 
    MyArea m_Area; 

В разрисованным классе области, я хочу сделать что-то вроде:

bool MyArea::on_draw(const Cairo::RefPtr<Cairo::Context>& cr) 
{ 
    Gtk::Allocation allocation = get_allocation(); 
    =====> int sqPix = ExampleWindow::getBd().sqPix; 

ответ

0

Возможно, вы не должны связывать свое окно верхнего уровня с областью рисования, иначе вы не сможете повторно использовать код чертежа в каком-либо другом окне приложения, например, изменить внешний вид примерной доски.

Вместо этого передайте ссылку на Совет или указатель на свой DrawingArea в его конструкторе. Вот конструктор окна, где DrawingArea берет ссылку на Совет. Вы можете использовать указатель и setBoard() вместо этого, если вы считаете, что DrawingArea не всегда будет ассоциироваться с одним советом:

ExampleWindow(const char * fn, const vector<int>& t) : bdw(t), m_Area(bdw) { 
    ... 
} 
0

Добавить указатель в ExampleWindow в MyArea определение, которое позже можно инициализировать в MyArea constructor. Таким образом, вы сможете получить доступ к общему интерфейсу ExampleWindow. Вы можете создавать публичные геттеры, чтобы позволить внешним пользователям (MyArea) получать доступ к полям.

+0

ли вы имеете в виду вызвать MyArea конструктор из ExampleWindow с одним аргументом * это? –

+0

Да, это было бы самым простым способом. – Adrian