无法将 Gtk::DrawingArea 与其在 C++ 上的空地文件中的形式关联起来

问题描述 投票:0回答:1

我正在为一个团队编写一个 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

c++ g++ gtkmm glade gtkmm3
1个回答
0
投票

问题是我必须使用 get_widget_driven 而不是 get_widget 并且最重要的是将 Scene 类的构造函数更改为

Scene::Scene(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& builder):
        Gtk::DrawingArea(cobject)

并且还包括整个 gtkmm.h,因为没有它,构造函数就不知道 Gtk::Builder

© www.soinside.com 2019 - 2024. All rights reserved.