解除引用窗口对象时,Gtkmm应用程序崩溃

时间:2016-02-26 13:10:51

标签: c++ user-interface gtkmm

我正在尝试使用gtkmm创建简单的应用程序,但我遇到了一些问题。

以下是现在的样子:

enter image description here

以下是生成它的代码:

MyWindow.h:

#ifndef MYWINDOW_H_
#define MYWINDOW_H_
#include <gtkmm/window.h>
#include <gtkmm/frame.h>
#include "MyDrawingArea.h"

class MyWindow :public Gtk::Window {
public:
    MyWindow();
    virtual ~MyWindow() {}

private:
    MyDrawingArea drawing_area;
};

#endif /* MYWINDOW_H_ */

MyWindow.cpp:

#include "MyWindow.h"

MyWindow::MyWindow() : drawing_area("Drawing area") {
    set_title("My app");
    set_border_width(10);
    add(drawing_area);
    drawing_area.draw_stuff_in_area();


    show_all_children();
}

MyDrawingArea.h:

#ifndef MYDRAWINGAREA_H_
#define MYDRAWINGAREA_H_
#include <gtkmm/frame.h>
#include <gtkmm/drawingarea.h>

class MyDrawingArea : public Gtk::Frame {
public:
    MyDrawingArea(const Glib::ustring& title);
    virtual ~MyDrawingArea() {}
    void draw_stuff_in_area();

private:
    Gtk::DrawingArea area;
};

#endif /* MYDRAWINGAREA_H_ */

MyDrawingArea.cpp:

#include "MyDrawingArea.h"
#include <iostream>
#include <gtkmm/window.h>

MyDrawingArea::MyDrawingArea(const Glib::ustring& title) : Gtk::Frame(title) {

    set_border_width(20);
    add(area);

    area.set_size_request(300, 250);
}

void MyDrawingArea::draw_stuff_in_area() {

    Cairo::RefPtr<Cairo::Context> cr = area.get_window()->create_cairo_context(); // program crashes here!
    // draw stuff with 'cr' here...

}

正如评论所示,当我尝试创建Cairo::Context时,程序会崩溃,但我不认为Cairo::Context创建是问题所在:每次取消引用该对象my_area.get_window()返回的程序崩溃了!

任何人都知道造成问题的原因是什么?

1 个答案:

答案 0 :(得分:1)

您好我检查了area.get_window()的返回值,因为documentation

  

如果实现了窗口小部件的窗口,则返回该窗口,否则为0。