我正在为一个团队编写一个 C++ 测试任务,所有内容都是用 gtk 编写的。我以前纯粹在 Qt 下编写,从来没有在 gtk/gtkmm 下编写。 该程序有一些小部件,我似乎已经弄清楚了其操作,但我无法让 DrawingArea 绘制任何内容,或者至少无法从林间空地文件中联系它的 protégé(与其他小部件不同)。我从控制台的输出中理解了这一点
** (main:11189): CRITICAL **: 22:58:23.000: Gtk::Builder::get_widget(): dynamic_cast<> failed.
我意识到此时问题出现在主窗口构造函数内部
builder->get_widget("scene_ui", scene);
类本身看起来像这样(所有代码都被盗了)
#pragma once
#include <gtkmm/drawingarea.h>
class Scene : public Gtk::DrawingArea
{
public:
Scene();
virtual ~Scene();
protected:
virtual bool on_draw(const Cairo::RefPtr<Cairo::Context>& cr);
};
#include "Scene.hpp"
#include <cairomm/context.h>
Scene::Scene()
{
}
Scene::~Scene()
{
}
bool Scene::on_draw(const Cairo::RefPtr<Cairo::Context>& cr)
{
Gtk::Allocation allocation = get_allocation();
const int width = allocation.get_width();
const int height = allocation.get_height();
const int lesser = MIN(width, height);
int xc, yc;
xc = width / 2;
yc = height / 2;
cr->set_line_width(lesser * 0.02);
// в первую очередь рисуется простая открытая дуга
cr->save();
cr->arc(width / 3.0, height / 4.0, lesser / 4.0, -(M_PI / 5.0), M_PI);
cr->close_path();
cr->set_source_rgb(0.0, 0.8, 0.0);
cr->fill_preserve();
cr->restore();
cr->stroke();
cr->save();
cr->arc(xc, yc, lesser / 4.0, 0.0, 2.0 * M_PI);
cr->set_source_rgba(0.0, 0.0, 0.8, 0.6);
cr->fill_preserve();
cr->restore();
cr->stroke();
double ex, ey, ew, eh;
ex = xc;
ey = 3.0 * height / 4.0;
ew = 3.0 * width / 4.0;
eh = height / 3.0;
cr->save();
cr->translate(ex, ey);
cr->scale(ew / 2.0, eh / 2.0);
cr->arc(0.0, 0.0, 1.0, 0.0, 2 * M_PI);
cr->set_source_rgba(0.8, 0.0, 0.0, 0.7);
cr->fill_preserve();
cr->restore();
cr->stroke();
return true;
}
我在 Debian 上使用 gtkmm-3.0 以及 Glade 和 g++ 怎么才能让他画??? 我尝试从文档复制代码,但全部来自 gtkmm4
问题是我必须使用 get_widget_driven 而不是 get_widget 并且最重要的是将 Scene 类的构造函数更改为
Scene::Scene(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder):
Gtk::DrawingArea(cobject)
并且还包括整个 gtkmm.h,因为没有它,构造函数就不知道 Gtk::Builder