Как установить метки для элементов круговой диаграммы KDChart? - PullRequest
0 голосов
/ 28 февраля 2012

Есть ли способ установить текстовые метки для каждого элемента круговой диаграммы, созданной с использованием библиотеки KDChart в Qt?

Если говорить более конкретно, я не использую архитектуру Model / View в этом конкретном случае.дело.Я создаю его, хотя KDChart::Widget и просто заполняю диаграмму, используя Widget::setDataCell().

Кажется, есть несколько способов установить текстовые метки для оси, но я не сталкивался с чем-то похожим для круговой диаграммы.Во всяком случае, это не то, что мне нужно.Я хочу установить метки для определенных точек, а не для своей оси.Применительно к круговой диаграмме это будет что-то вроде названных секторов.

Я подумал, что, возможно, с помощью KDChart::Legend с заполненными значениями я могу добиться требуемого поведения, но это не сработало.

Вот пример кода, может быть, это поможет несколько.Но имейте в виду, что это изменилось (очищено от загроможденных линий), и я не проверял его правильность:

KDChart::Widget* newChart = new KDChart::Widget;
newChart->setType( KDChart::Widget::Pie );
int curColNo = 0; // it's not a size_t 'coz setDataCell requires an int
for( QVector::const_iterator curValueIt = response.begin(); curValueIt != response.end(); ++curValueIt )
{
    newChart->setDataCell( 0, curColNo, *curValueIt );
    newChart->diagram()->setBrush( curColNo++, QBrush( m_responsesColors[curValueIt] ) );
    m_legend->addDiagram( newChart->diagram() );
}

m_mainLayout.addWidget( newChart, m_curLayoutRowNo, m_curLayoutColNo );

Еще одна вещь - я попытался заполнить его несогласованными номерами столбцов (0,2,5, 9 и т. Д.) И круговая диаграмма была нарисована неправильно - некоторые сектора перекрывали другие.В других типах диаграмм (например, гистограмма) все данные были отображены правильно.

Есть ли у вас какие-либо идеи по поводу меток элементов?

PS Я рассчиталчто не так с заполнением столбцов круговой диаграммы, пропуская некоторые из них.Если вы заполняете столбцы непоследовательно (пропуская некоторые из них), то просто установите значения этих пропущенных столбцов равными нулю.Это исправит проблемы с неправильной визуализацией круговой диаграммы.

Вероятно, KDChart сам должен определить пропущенные столбцы и установить для него нулевое значение автоматически, но это не так.Так что сделай это сам.

Надеюсь, это кому-нибудь поможет.

1 Ответ

0 голосов
/ 29 февраля 2012

Я нашел решение самостоятельно.Учитывая небольшой объем информации о библиотеке KDChart, я публикую ее здесь в надежде, что она поможет кому-то с подобной проблемой.

Решение лежит довольно глубоко в иерархии KDChart.Вам необходимо вручную включить отображение меток.Я создал для него отдельную функцию.

void setValuesVisible( KDChart::AbstractDiagram* diagram, bool visible ) throw()
{
   const QFont font( QFont( "Comic", 10 ) ); // the font for all labels
   const int colCount = diagram->model()->columnCount();
   for ( int iColumn = 0; iColumn < colCount; ++iColumn )
   {
       //QBrush brush( diagram->brush( iColumn ) ); // here you can get a color of the specified column
       KDChart::DataValueAttributes a( diagram->dataValueAttributes( iColumn ) );
       KDChart::TextAttributes ta( a.textAttributes() );
       ta.setRotation( 0 );
       ta.setFont( font );
       ta.setAutoRotate( true );
       //ta.setPen( QPen( brush.color() ) ); // here you can change a color of the current label's text

       ta.setVisible( visible ); // this line turns on labels display

       a.setTextAttributes( ta );
       a.setVisible( true );
       diagram->setDataValueAttributes( iColumn, a);
   }

   diagram->update();
}

Имейте в виду, что есть более короткое решение - просто установите TextAttributes из "global" DataValueAttributes (для этого есть методкласс KDChart::AbstractDiagram - AbstractDiagram::dataValueAttributes() без каких-либо параметров), если вам не нужны уникальные параметры текста для каждой метки.

...