Невозможно отобразить текст в контексте cairomm / gtkmm - PullRequest
0 голосов
/ 28 октября 2019

Я пытался нарисовать текст в виджете DrawingArea. Мой пользовательский класс наследует Gtk :: DrawingArea, и я переопределяю метод on_draw. У меня нет проблем с рисованием других вещей, таких как дуги или линии, но текст просто не появится. Вот мой код метода:

bool SpeedDisplay::on_draw(const Cairo::RefPtr<Cairo::Context>& cr)
{
  const int width = 400;
  const int height = 400;

  cr->scale(width, height);
  cr->translate(1, 0.5);
  cr->set_line_width(m_line_width);

  cr->save();
  cr->set_source_rgba(1, 1, 1, 0);
  cr->paint();
  cr->restore();
  cr->set_line_cap(Cairo::LINE_CAP_ROUND);
  cr->arc(0, 0, m_radius, 0.73*M_PI, 2.27*M_PI);
  cr->save();
  cr->set_source_rgba(1.0, 1.0, 1.0, 0.8);
  cr->fill_preserve();
  cr->restore();
  cr->stroke_preserve();
  cr->clip();


  [1]cr->set_line_cap(Cairo::LINE_CAP_ROUND);
  for (int i = 0; i <= 20; i++)
  {
    double inset = 0.05;

    cr->save();

    if(i % 2 != 0)
    {
      inset *= 0.8;
      cr->set_line_width(0.01);
    }

    if(i%2==0)  {
      cr->set_font_size(5);
      cr->select_font_face("Purisa", Cairo::FONT_SLANT_NORMAL, Cairo::FONT_WEIGHT_NORMAL);
      //cr->move_to((m_radius+0.1) * cos (i * 0.75*M_PI / 10+(0.75*M_PI)),(m_radius+0.1) * sin (i * 0.75*M_PI / 10+(0.75*M_PI)));
      cr->move_to(20,30);
      cr->show_text("test");
      //cr->show_text(std::to_string(i*10));
      cr->stroke();
    }

    cr->move_to((m_radius - inset) * cos (i * 0.75*M_PI / 10+(0.75*M_PI)),(m_radius - inset) * sin (i * 0.75*M_PI / 10+(0.75*M_PI)));
    cr->line_to (m_radius * cos (i * 0.75*M_PI / 10+(0.75*M_PI)),m_radius * sin (i * 0.75*M_PI / 10+(0.75*M_PI)));
    cr->stroke();
    cr->restore();
  }

  double needleAngle=test;

  cr->save();
  cr->set_line_cap(Cairo::LINE_CAP_ROUND);

  //Aiguille
  cr->save();
  cr->set_line_width(m_line_width / 3);
  cr->set_source_rgba(1.0, 0, 0, 0.8);
  cr->move_to(0, 0);
  cr->line_to(sin(needleAngle* 1.25*M_PI / 10+(1.25*M_PI)) * (m_radius * 0.9),-cos(needleAngle* 1.25*M_PI / 10+(1.25*M_PI)) * (m_radius * 0.9));
  cr->stroke();
  cr->restore();

  //Petit point noir central
  cr->arc(0, 0, m_line_width / 3.0, 0, 2 * M_PI);
  cr->fill();

  if(needleAngle==12)back=1;
  else if(needleAngle==0)back=0;
  if(back==0)test++;
  else test--;

  return true;
}

Вот мое окно после компиляции и выполнения моей программы. Как видите, все нарисовано так, как ожидалось, но нигде нет видимого текста. Кнопки не являются частью области рисования.

Result

...