Я пытался нарисовать текст в виджете 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;
}
Вот мое окно после компиляции и выполнения моей программы. Как видите, все нарисовано так, как ожидалось, но нигде нет видимого текста. Кнопки не являются частью области рисования.