gpt4 book ai didi

c++ - 在 Cairo Context 中创建智能指针时出现段错误

转载 作者:行者123 更新时间:2023-11-30 04:32:18 36 4
gpt4 key购买 nike

我在 Cairo-Context 上创建 Cairo::RefPtr 时遇到了一些问题。我真的无法想象为什么这个段错误,除了指针指向完全​​错误的东西。

这是我的代码。

int main(int argc, char * argv[])
{
Gtk::Main kit(argc, argv);
Gtk::Window window;
Gtk::DrawingArea drawarea;
window.add(drawarea);
Cairo::RefPtr<Cairo::Context> ccontext = drawarea.get_window()->create_cairo_context();
Gtk::Allocation allocation = drawarea.get_allocation();
const int width = allocation.get_width();
const int height = allocation.get_height();
ccontext->set_source_rgb(1.0, 0.0, 0.0);
ccontext->set_line_width(2.0);
ccontext->move_to(0,0);
ccontext->line_to(width, height);

Gtk::Main::run(window);

}

这就是 GDB 所说的:

Starting program: /home/marian/Desktop/C++/Langton/Langton [Thread debugging using libthread_db enabled]

Program received signal SIGSEGV, Segmentation fault. 0xb7be852e in Gdk::Window::create_cairo_context() () from /usr/lib/libgdkmm-3.0.so.1

我用 gcc (GCC) 4.6.1 20110819(预发行版)编译了这个。

提前致谢

最佳答案

Gtk::Widget::get_window() 返回一个空的 Glib::RefPtr,因为这个小部件还没有实现。

基于GtkDrawingArea documentation ,您需要挂接到“绘图”信号来处理绘图,您的 Cairo 上下文已经创建并交给您。回到 Gtkmm reference ,您可以使用 Gtk::Widget::signal_draw() Hook 它,或者您可以重载虚拟 on_draw() 函数来处理您的绘图。

此外,您还需要在每个小部件(即绘图区和窗口)上调用 .show(),并调用 ccontext->stroke() 以实际绘制线条。

结果看起来像这样:

#include <gtkmm.h>

bool draw (const Cairo::RefPtr<Cairo::Context> &ccontext, Gtk::DrawingArea *drawarea)
{
Gtk::Allocation allocation = drawarea->get_allocation();
const int width = allocation.get_width();
const int height = allocation.get_height();
ccontext->set_source_rgb(1.0, 0.0, 0.0);
ccontext->set_line_width(2.0);
ccontext->move_to(0,0);
ccontext->line_to(width, height);
ccontext->stroke ();

return true;
}

int main(int argc, char * argv[])
{
Gtk::Main kit(argc, argv);
Gtk::Window window;
Gtk::DrawingArea drawarea;

drawarea.signal_draw ().connect (sigc::bind (sigc::ptr_fun (&draw),
&drawarea));
window.add(drawarea);
window.show_all ();

Gtk::Main::run(window);
return 0;
}

或者:

#include <gtkmm.h>

class LineBox : public Gtk::DrawingArea
{
protected:
virtual bool on_draw (const Cairo::RefPtr<Cairo::Context> &ccontext);
};

bool LineBox::on_draw (const Cairo::RefPtr<Cairo::Context> &ccontext)
{
Gtk::Allocation allocation = get_allocation();
const int width = allocation.get_width();
const int height = allocation.get_height();
ccontext->set_source_rgb(1.0, 0.0, 0.0);
ccontext->set_line_width(2.0);
ccontext->move_to(0,0);
ccontext->line_to(width, height);
ccontext->stroke ();

return true;
}

int main(int argc, char * argv[])
{
Gtk::Main kit(argc, argv);
Gtk::Window window;
LineBox drawarea;

window.add(drawarea);
window.show_all ();

Gtk::Main::run(window);
return 0;
}

关于c++ - 在 Cairo Context 中创建智能指针时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7771623/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com