@@ -0,0 +1,29 | |||
|
1 | /*! | |
|
2 | \example examples/legend | |
|
3 | \title Legend Example | |
|
4 | \subtitle | |
|
5 | ||
|
6 | This example shows how to detach legend from chart and how to attach it back. By default the chart | |
|
7 | draws the legend inside same view with the chart. In some cases user may want to draw legend to somewhere else. To make this possible the legend can be detached from the chart. Detaching means that chart doesn't draw the legend or try to change it's layout. Detached can then be drawn where user wants, for example in different graphics scene. In this example we do so. | |
|
8 | ||
|
9 | First we create our chart as usual. | |
|
10 | ||
|
11 | \snippet ../examples/legend/mainwidget.cpp 1 | |
|
12 | ||
|
13 | Here we create custom graphics scene, where we want to draw the detached legend. | |
|
14 | ||
|
15 | \snippet ../examples/legend/mainwidget.cpp 2 | |
|
16 | ||
|
17 | Add some series to the chart. | |
|
18 | ||
|
19 | \snippet ../examples/legend/mainwidget.cpp 3 | |
|
20 | ||
|
21 | Here we detach the legend. After detaching, we set new geometry for it and add it to the custom scene. The custom scene adopts the legend and becomes new parent for it. Note that chart will still update the contents of the legend. | |
|
22 | ||
|
23 | \snippet ../examples/legend/mainwidget.cpp 4 | |
|
24 | ||
|
25 | To attach legend back to chart we first remove it from the custom scene. Then we add legend to the scene, where chart is. Last we attach legend to chart. Attaching legend to chart automatically sets the QChart as parent for legend. | |
|
26 | ||
|
27 | \snippet ../examples/legend/mainwidget.cpp 5 | |
|
28 | ||
|
29 | */ |
@@ -17,6 +17,7 | |||
|
17 | 17 | <li><a href="examples-barchart.html">Bar chart</a></li> |
|
18 | 18 | <li><a href="examples-customchart.html">Custom chart</a></li> |
|
19 | 19 | <li><a href="examples-groupedbarchart.html">Grouped bar chart</a></li> |
|
20 | <li><a href="examples-legend.html">Legend</a></li> | |
|
20 | 21 | <li><a href="examples-linechart.html">Line chart</a></li> |
|
21 | 22 | <li><a href="examples-modeldata.html">Model data</a></li> |
|
22 | 23 | <li><a href="examples-percentbarchart.html">Percent bar chart</a></li> |
@@ -13,10 +13,7 QTCOMMERCIALCHART_USE_NAMESPACE | |||
|
13 | 13 | MainWidget::MainWidget(QWidget *parent) : |
|
14 | 14 | QWidget(parent) |
|
15 | 15 | { |
|
16 | m_setCount = 0; | |
|
17 | m_chart = new QChart(); | |
|
18 | ||
|
19 | //![1] | |
|
16 | // Create buttons for ui | |
|
20 | 17 | m_buttonLayout = new QGridLayout(); |
|
21 | 18 | QPushButton *detachLegendButton = new QPushButton("detach legend"); |
|
22 | 19 | connect(detachLegendButton, SIGNAL(clicked()), this, SLOT(detachLegend())); |
@@ -31,12 +28,15 MainWidget::MainWidget(QWidget *parent) : | |||
|
31 | 28 | QPushButton *removeBarsetButton = new QPushButton("remove barset"); |
|
32 | 29 | connect(removeBarsetButton, SIGNAL(clicked()), this, SLOT(removeBarset())); |
|
33 | 30 | m_buttonLayout->addWidget(removeBarsetButton, 3, 0); |
|
34 | //![1] | |
|
35 | 31 | |
|
36 | 32 | // Create chart view with the chart |
|
33 | //![1] | |
|
34 | m_chart = new QChart(); | |
|
37 | 35 | m_chartView = new QChartView(m_chart, this); |
|
38 | 36 | m_chartView->setRubberBand(QChartView::HorizonalRubberBand); |
|
37 | //![1] | |
|
39 | 38 | |
|
39 | // Create custom scene and view, where detached legend will be drawn | |
|
40 | 40 | //![2] |
|
41 | 41 | m_customView = new QGraphicsView(this); |
|
42 | 42 | m_customScene = new QGraphicsScene(this); |
@@ -55,6 +55,7 MainWidget::MainWidget(QWidget *parent) : | |||
|
55 | 55 | |
|
56 | 56 | void MainWidget::createSeries() |
|
57 | 57 | { |
|
58 | //![3] | |
|
58 | 59 | m_series = new QBarSeries(); |
|
59 | 60 | addBarset(); |
|
60 | 61 | addBarset(); |
@@ -69,54 +70,51 void MainWidget::createSeries() | |||
|
69 | 70 | m_chart->axisY()->setNiceNumbersEnabled(true); |
|
70 | 71 | |
|
71 | 72 | m_chartView->setRenderHint(QPainter::Antialiasing); |
|
73 | //![3] | |
|
72 | 74 | } |
|
73 | 75 | |
|
74 | 76 | void MainWidget::detachLegend() |
|
75 | 77 | { |
|
76 | //![3] | |
|
77 |
// |
|
|
78 | // Detach legend from chart and | |
|
79 | // put legend to our custom scene | |
|
80 | //![4] | |
|
78 | 81 | QLegend *legend = m_chart->legend(); |
|
79 | 82 | legend->detachFromChart(); |
|
80 | 83 | legend->setGeometry(m_customView->rect()); |
|
81 | // legend->setAlignment(QLegend::AlignmentLeft); | |
|
82 | ||
|
83 | // Put legend to our custom scene | |
|
84 | 84 | m_customScene->addItem(legend); |
|
85 |
//![ |
|
|
85 | //![4] | |
|
86 | 86 | |
|
87 |
// This c |
|
|
88 |
QSize |
|
|
89 |
|
|
|
90 |
|
|
|
87 | // This forces redraw | |
|
88 | QSize delta(1,1); | |
|
89 | resize(size() + delta); | |
|
90 | resize(size() - delta); | |
|
91 | 91 | } |
|
92 | 92 | |
|
93 | 93 | |
|
94 | 94 | void MainWidget::attachLegend() |
|
95 | 95 | { |
|
96 | //![4] | |
|
96 | // Remove legend from custom scene and put it back to chartview scene. | |
|
97 | // Attach legend back to chart, so that layout works. | |
|
98 | ||
|
99 | //![5] | |
|
97 | 100 | QLegend *legend = m_chart->legend(); |
|
98 | 101 | |
|
99 | 102 | if (m_customScene->items().contains(legend)) { |
|
100 | // Remove legend from custom scene and put it back to chartview scene. | |
|
101 | // Attach legend back to chart, so that layout works. | |
|
102 | 103 | m_customScene->removeItem(legend); |
|
103 | legend->setParent(m_chart); | |
|
104 | 104 | m_chartView->scene()->addItem(legend); |
|
105 | // legend->setAlignment(QLegend::AlignmentBottom); | |
|
106 | 105 | legend->attachToChart(); |
|
107 | 106 | } |
|
108 |
//![ |
|
|
107 | //![5] | |
|
109 | 108 | |
|
110 |
// This c |
|
|
111 |
QSize |
|
|
112 |
|
|
|
113 |
|
|
|
109 | // This forces redraw | |
|
110 | QSize delta(1,1); | |
|
111 | resize(size() + delta); | |
|
112 | resize(size() - delta); | |
|
114 | 113 | } |
|
115 | 114 | |
|
116 | 115 | void MainWidget::addBarset() |
|
117 | 116 | { |
|
118 | QBarSet *barSet = new QBarSet(QString("set ") + QString::number(m_setCount)); | |
|
119 | m_setCount++; | |
|
117 | QBarSet *barSet = new QBarSet(QString("set ") + QString::number(m_series->barsetCount())); | |
|
120 | 118 | qreal delta = m_series->barsetCount() * 0.1; |
|
121 | 119 | *barSet << QPointF(0.0 + delta, 1 + delta) << QPointF(1.0 + delta, 2 + delta) << QPointF(2.0 + delta, 3 + delta) << QPointF(3.0 + delta, 4 + delta); |
|
122 | 120 | m_series->append(barSet); |
@@ -33,17 +33,12 private: | |||
|
33 | 33 | QChart *m_chart; |
|
34 | 34 | QBarSeries *m_series; |
|
35 | 35 | |
|
36 | QGraphicsScene *m_scene; | |
|
37 | 36 | QChartView *m_chartView; |
|
38 | 37 | QGridLayout *m_mainLayout; |
|
39 | 38 | QGridLayout *m_buttonLayout; |
|
40 | 39 | |
|
41 | 40 | QGraphicsView *m_customView; |
|
42 | 41 | QGraphicsScene *m_customScene; |
|
43 | QGraphicsGridLayout *m_customLayout; | |
|
44 | ||
|
45 | ||
|
46 | int m_setCount; | |
|
47 | 42 | }; |
|
48 | 43 | |
|
49 | 44 | #endif // MAINWIDGET_H |
@@ -316,7 +316,7 void ChartPresenter::updateLayout() | |||
|
316 | 316 | QLegend* legend = m_chart->d_ptr->m_legend; |
|
317 | 317 | |
|
318 | 318 | // recalculate legend position |
|
319 | if (legend->isAttachedToChart() && legend->isEnabled()) { | |
|
319 | if (legend != 0 && legend->isAttachedToChart() && legend->isEnabled()) { | |
|
320 | 320 | |
|
321 | 321 | QRect legendRect; |
|
322 | 322 |
@@ -87,7 +87,7 QTCOMMERCIALCHART_BEGIN_NAMESPACE | |||
|
87 | 87 | */ |
|
88 | 88 | |
|
89 | 89 | QLegend::QLegend(QChart *chart):QGraphicsWidget(chart), |
|
90 | d_ptr(new QLegendPrivate(chart->d_ptr->m_presenter,this)) | |
|
90 | d_ptr(new QLegendPrivate(chart->d_ptr->m_presenter,chart,this)) | |
|
91 | 91 | { |
|
92 | 92 | setZValue(ChartPresenter::LegendZValue); |
|
93 | 93 | setFlags(QGraphicsItem::ItemClipsChildrenToShape); |
@@ -200,7 +200,7 void QLegend::detachFromChart() | |||
|
200 | 200 | */ |
|
201 | 201 | void QLegend::attachToChart() |
|
202 | 202 | { |
|
203 |
d_ptr-> |
|
|
203 | d_ptr->attachToChart(); | |
|
204 | 204 | } |
|
205 | 205 | |
|
206 | 206 | /*! |
@@ -292,9 +292,10 qreal QLegend::minHeight() const | |||
|
292 | 292 | |
|
293 | 293 | //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
|
294 | 294 | |
|
295 | QLegendPrivate::QLegendPrivate(ChartPresenter* presenter,QLegend *q): | |
|
295 | QLegendPrivate::QLegendPrivate(ChartPresenter* presenter, QChart *chart, QLegend *q): | |
|
296 | 296 | q_ptr(q), |
|
297 | 297 | m_presenter(presenter), |
|
298 | m_chart(chart), | |
|
298 | 299 | m_markers(new QGraphicsItemGroup(q)), |
|
299 | 300 | m_alignment(QLegend::AlignmentTop), |
|
300 | 301 | m_offsetX(0), |
@@ -407,6 +408,12 void QLegendPrivate::updateLayout() | |||
|
407 | 408 | } |
|
408 | 409 | } |
|
409 | 410 | |
|
411 | void QLegendPrivate::attachToChart() | |
|
412 | { | |
|
413 | m_attachedToChart = true; | |
|
414 | q_ptr->setParent(m_chart); | |
|
415 | } | |
|
416 | ||
|
410 | 417 | void QLegendPrivate::handleSeriesAdded(QAbstractSeries *series, Domain *domain) |
|
411 | 418 | { |
|
412 | 419 | Q_UNUSED(domain) |
@@ -34,6 +34,7 | |||
|
34 | 34 | |
|
35 | 35 | QTCOMMERCIALCHART_BEGIN_NAMESPACE |
|
36 | 36 | |
|
37 | class QChart; | |
|
37 | 38 | class ChartPresenter; |
|
38 | 39 | class QAbstractSeries; |
|
39 | 40 | |
@@ -41,11 +42,12 class QLegendPrivate : public QObject | |||
|
41 | 42 | { |
|
42 | 43 | Q_OBJECT |
|
43 | 44 | public: |
|
44 | QLegendPrivate(ChartPresenter *chart,QLegend *q); | |
|
45 | QLegendPrivate(ChartPresenter *presenter, QChart *chart, QLegend *q); | |
|
45 | 46 | ~QLegendPrivate(); |
|
46 | 47 | |
|
47 | 48 | void setOffset(qreal x, qreal y); |
|
48 | 49 | void updateLayout(); |
|
50 | void attachToChart(); | |
|
49 | 51 | |
|
50 | 52 | public Q_SLOTS: |
|
51 | 53 | void handleSeriesAdded(QAbstractSeries *series, Domain *domain); |
@@ -56,6 +58,7 public Q_SLOTS: | |||
|
56 | 58 | private: |
|
57 | 59 | QLegend *q_ptr; |
|
58 | 60 | ChartPresenter *m_presenter; |
|
61 | QChart* m_chart; | |
|
59 | 62 | QGraphicsItemGroup* m_markers; |
|
60 | 63 | QLegend::Alignments m_alignment; |
|
61 | 64 | QBrush m_brush; |
General Comments 0
You need to be logged in to leave comments.
Login now