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 应用程序在取消引用窗口对象时崩溃的主要内容,如果未能解决你的问题,请参考以下文章