Gtkmm 3.0:如何在DrawingArea的on_draw方法中获取用户类数据

Gtkmm 3.0: How to get user class data in on_draw method of DrawingArea

本文关键字:方法 draw 获取 数据 用户 on DrawingArea Gtkmm      更新时间:2023-10-16

在我的第一个Gtkmm 3.0程序中,我在程序结构和从DrawingArea类访问我的类数据方面遇到了麻烦。

基于gnome网站的演示程序("绘制细线"),我有一个窗口类,一个drawingArea类和一个带有用户数据的Board类。

drawingArea对象被定义为window类中的成员变量。在窗口类构造函数中,我实例化了一个Board对象。

现在我想在drawingArea类的on_draw例程中访问Board成员变量。最好的方法是什么?

我的board class有:

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;  

您可能不应该将顶层窗口与绘图区域耦合,否则您无法在应用程序的其他窗口中重用绘图代码,例如,首选项更改示例板的外观。

相反,在DrawingArea的构造函数中传递Board引用或指针。这里是窗口的构造函数,其中DrawingArea接受Board引用。如果你认为DrawingArea并不总是与一个Board相关联,你可以使用指针和setBoard()来代替:
ExampleWindow(const char * fn, const vector<int>& t) : bdw(t), m_Area(bdw) {
  ...
}

添加指向ExampleWindow的指针到MyArea的定义,稍后可以在MyArea构造函数中初始化。这样您就可以访问ExampleWindow的公共接口。您可以创建公共getter来允许外部用户(MyArea)访问字段。