Gtkmm 应用程序在取消引用窗口对象时崩溃

Posted

技术标签:

【中文标题】Gtkmm 应用程序在取消引用窗口对象时崩溃【英文标题】:Gtkmm application crashes when dereferencing window object 【发布时间】:2016-02-26 13:10:51 【问题描述】:

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

现在是这样的:

这是生成它的代码:


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( ) 使程序崩溃!

有人知道是什么原因造成的吗?

【问题讨论】:

不管空指针如何,都不是在绘图区域上绘制的方式;而是连接到绘图区域的draw 信号,并在信号处理程序中进行绘图。信号处理程序将获得一个 Cairo::Context 传递给它,因此您不必创建一个。 但是如果我想启动绘图,而不是等待信号呢? 所以你不要在你的 on_draw() 中画任何东西,直到你想画。您无法真正控制 on_draw() 何时被调用,但您可以决定何时调用它。顺便说一句,这里有很多例子:developer.gnome.org/gtkmm-tutorial/stable/…。但是您可能更喜欢使用 GooCanvas,它可以让您在画布上放置形状,然后为您绘制。 【参考方案1】:

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

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

【讨论】:

以上是关于Gtkmm 应用程序在取消引用窗口对象时崩溃的主要内容,如果未能解决你的问题,请参考以下文章

Gtkmm - 隐藏窗口而不关闭应用程序

gtkmm 3 窗口 64 位

如何使用 gtkmm 抓取和隐藏光标?

GTKMM/C++ 窗口事件失去/重新获得焦点?

单击图像后,相机应用程序崩溃

由于尝试在空对象引用上调用虚拟方法“ ”,应用程序崩溃