重寫paintEvent事件,代碼如下
void xx::paintEvent(QPaintEvent *event){ QPainter painter(this); //繪制x,y軸,_maxWidth為y軸邊距 painter.drawLine(QPoint(_maxWidth,20),QPoint(width(),20)); painter.drawLine(QPoint(_maxWidth, 20), QPoint(_maxWidth,height())); //繪制刻度,_maxMinutes為x軸最大刻度 int num = (_maxMinutes - _minMinutes) / 5; int interval = (width() - _maxWidth) / num; for (int index = 0; index != num;++index){ painter.drawLine(QPoint(_maxWidth + index * interval, 20), QPoint(_maxWidth + index * interval, 15)); painter.drawText(QPoint(_maxWidth + index * interval, 10), QString::number(_minMinutes + index*5)); } num = _dataMap.size(); interval = (height() - 20) / (num + 2); //繪制數據_dataMap,QString(y軸坐標名稱:起始時間-結束時間& 起始時間-結束時間) QMap<int, QString>::iterator it = _dataMap.begin(); int index = 1; for (; it != _dataMap.end(); ++it){ QStringList list = it.value().split(":"); if (list.size() != 2) continue; painter.drawText(QPoint(0, 20 + interval * index), list[0]); painter.drawLine(QPoint(_maxWidth, 20 + interval * index), QPoint(_maxWidth + 5, 20 + interval * index)); for each (QString var in list[1].split("&")){ if (var.isEmpty()) continue; QStringList interalList = var.split("-"); if (interalList.size() != 2) continue; int x = (interalList[0].toDouble() / _maxMinutes) * (width() - _maxWidth); int x1 = (interalList[1].toDouble() / _maxMinutes) * (width() - _maxWidth); painter.drawLine(QPoint(_maxWidth + x, 20 + interval * index), QPoint(_maxWidth + x1, 20 + interval * index)); } ++index; } }
效果如下
原文來自微信公眾號"程序員成長日志",已經工作的程序員朋友可以關注下公眾號“程序員成長日志”,分享日常工作中解決的問題即可賺取稿費,大家一起成長~