void VUMeter::paintBorder() { QPainter painter(this); painter.setWindow(0, 0, 50, 500); painter.setRenderHint(QPainter::HighQualityAntialiasing); QColor light = Qt::gray; QColor dark = colBack.darker(180); painter.setPen(QPen(colBack, 2, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin)); QLinearGradient linGrad(2, 250, 10, 250); linGrad.setColorAt(0, light); linGrad.setColorAt(1, colBack); linGrad.setSpread(QGradient::PadSpread); painter.setBrush(linGrad); QRectF border(2, 5, 48, 490); painter.drawRoundRect(border, 10, 3); QLinearGradient linGrad1(40, 250, 48, 250); linGrad1.setColorAt(0, colBack); linGrad1.setColorAt(1, dark); linGrad1.setSpread(QGradient::PadSpread); painter.setBrush(linGrad1); QRectF border1(25, 5, 23, 490); painter.drawRoundRect(border1, 10, 3); // paint label painter.setPen(QPen(colValue, 2)); QRectF channel(5, 450, 40, 40); QFont valFont("Arial", 20, QFont::Bold); painter.setFont(valFont); painter.drawText(channel, Qt::AlignCenter, label); }
void BelowsEnh::paintBorder() { QPainter painter(this); painter.setWindow(0, 0, 100, 540); painter.setRenderHint(QPainter::HighQualityAntialiasing); QColor light = Qt::white; QColor dark = colBack.darker(140); painter.setPen(QPen(colBack, 3, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin)); QLinearGradient linGrad(5, 250, 10, 250); linGrad.setColorAt(0, light); linGrad.setColorAt(1, colBack); linGrad.setSpread(QGradient::PadSpread); painter.setBrush(linGrad); QRectF border(5, 5, 90, 530); painter.drawRoundRect(border, 30, 5); QLinearGradient linGrad1(85, 250, 95, 250); linGrad1.setColorAt(0, colBack); //linGrad1.setColorAt(1, dark); linGrad1.setSpread(QGradient::PadSpread); painter.setBrush(linGrad1); QRectF border1(20, 5, 75, 530); painter.drawRoundRect(border1, 30, 5); // paint label painter.setPen(QPen(colValue, 2)); QRectF Left(20, 505, 60, 20); //QRectF Right(55, 505, 25, 20); QFont valFont("Arial", 12, QFont::Bold); painter.setFont(valFont); painter.drawText(Left, Qt::AlignCenter, "Vent."); //painter.drawText(Right, Qt::AlignCenter, "R"); }
void VUMeter::drawBar(QPainter *painter) { painter->save(); QLinearGradient linGrad(50, 0, 50, 500); linGrad.setColorAt(0, colorHigh); linGrad.setColorAt(1, colorLow); linGrad.setSpread(QGradient::PadSpread); painter->setBrush(linGrad); //绘制柱状条 QRectF bar3(20, 50, 25, 450); painter->drawRect(bar3); QRectF bar4(55, 50, 25, 450); painter->drawRect(bar4); //绘制柱状背景 painter->setBrush(QColor(40, 40, 40)); double length = 450.0; double leftBar = abs(length * (minValue - leftValue) / (maxValue - minValue)); double rightBar = abs(length * (minValue - rightValue) / (maxValue - minValue)); QRectF bar1(20, 50, 25, 450 - leftBar); painter->drawRect(bar1); QRectF bar2(55, 50, 25, 450 - rightBar); painter->drawRect(bar2); painter->setPen(QPen(Qt::black, 2)); for (int i = 0; i <= 60; i++) { painter->drawLine(21, 500 - 450 * i / 60, 44, 500 - 450 * i / 60); painter->drawLine(56, 500 - 450 * i / 60, 79, 500 - 450 * i / 60); } painter->restore(); }
void VUMeter::drawBorder(QPainter *painter) { painter->save(); QColor light = Qt::white; QColor dark = colorBg.darker(140); painter->setPen(QPen(colorBg, 3, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin)); QLinearGradient linGrad(5, 250, 10, 250); linGrad.setColorAt(0, light); linGrad.setColorAt(1, colorBg); linGrad.setSpread(QGradient::PadSpread); painter->setBrush(linGrad); QRectF border(5, 5, 90, 530); painter->drawRoundRect(border, 30, 5); QLinearGradient linGrad1(85, 250, 95, 250); linGrad1.setColorAt(0, colorBg); linGrad1.setColorAt(1, dark); linGrad1.setSpread(QGradient::PadSpread); painter->setBrush(linGrad1); QRectF border1(20, 5, 75, 530); painter->drawRoundRect(border1, 30, 5); //绘制左右文字 painter->setPen(QPen(colorValue, 2)); QRectF Left(20, 505, 25, 20); QRectF Right(55, 505, 25, 20); QFont valFont("Arial", 12, QFont::Bold); painter->setFont(valFont); painter->drawText(Left, Qt::AlignCenter, "左"); painter->drawText(Right, Qt::AlignCenter, "右"); painter->restore(); }
void QProg::paintBorder() { QPainter painter(this); painter.setWindow(0, 0, 470, 80); painter.setRenderHint(QPainter::Antialiasing); QLinearGradient linGrad(5, 40, 15, 40); linGrad.setColorAt(0, Qt::white); linGrad.setColorAt(1, Qt::black); linGrad.setSpread(QGradient::PadSpread); painter.setBrush(linGrad); QRectF border(5, 5, 460, 70); painter.drawRoundRect(border, 3); // value rect painter.setBrush(QColor(70, 70, 70)); QRectF value(385, 10, 75, 60); painter.drawRoundRect(value, 15); }
void BelowsEnh::paintBar() { QPainter painter(this); painter.setWindow(0, 0, 100, 540); painter.setRenderHint(QPainter::Antialiasing); QLinearGradient linGrad(50, 0, 50, 500); linGrad.setColorAt(0, colHigh); linGrad.setColorAt(1, colLow); linGrad.setSpread(QGradient::PadSpread); painter.setBrush(linGrad); // draw color bar // QRectF bar3(20, 50, 25, 450); QRectF bar3(20, 50, 60, 450); painter.drawRect(bar3); //QRectF bar4(55, 50, 25, 450); //painter.drawRect(bar4); // draw background bar painter.setBrush(QColor(40, 40, 40)); double length = 450.0; double leftBar = abs(length * (min-leftVal)/(max-min)); double rightBar = abs(length * (min-rightVal)/(max-min)); QRectF bar1(20, 50, 60, 450-leftBar); painter.drawRect(bar1); //QRectF bar2(55, 50, 25, 450-rightBar); //painter.drawRect(bar2); painter.setPen(QPen(Qt::black, 2)); for (int i = 0; i <=60; i++) { //painter.drawLine(21, 500-450*i/60, 44, 500-450*i/60); painter.drawLine(21, 500-450*i/60, 79, 500-450*i/60); //painter.drawLine(56, 500-450*i/60, 79, 500-450*i/60); } }
void VUMeter::paintBar() { QPainter painter(this); painter.setWindow(0, 0, 50, 500); painter.setRenderHint(QPainter::HighQualityAntialiasing); QLinearGradient linGrad(25, 0, 25, 500); linGrad.setColorAt(0, colHigh); linGrad.setColorAt(1, colLow); linGrad.setSpread(QGradient::PadSpread); painter.setBrush(linGrad); // draw color bar QRectF col_bar(10, 50, 30, 400); painter.drawRect(col_bar); // draw background bar painter.setBrush(QColor(40, 40, 40)); int length = 400.0; int bar = abs(length*(min-val)/(max-min)); QRectF back_bar(10, 50, 30, 400-bar); painter.drawRect(back_bar); }
////////////////////////////////////////////////////////////////////// // Called to update spectrum data for displaying on the screen ////////////////////////////////////////////////////////////////////// void CPlotter::draw() { int i,n; int w; int h; int xmin, xmax; if (m_DrawOverlay) { drawOverlay(); m_DrawOverlay = false; } QPoint LineBuf[MAX_SCREENSIZE]; if (!m_Running) return; // get/draw the waterfall w = m_WaterfallPixmap.width(); h = m_WaterfallPixmap.height(); // no need to draw if pixmap is invisible if ((w != 0) || (h != 0)) { // move current data down one line(must do before attaching a QPainter object) m_WaterfallPixmap.scroll(0,1,0,0, w, h); QPainter painter1(&m_WaterfallPixmap); // get scaled FFT data getScreenIntegerFFTData(255, qMin(w, MAX_SCREENSIZE), m_MaxdB, m_MindB, m_FftCenter - (qint64)m_Span/2, m_FftCenter + (qint64)m_Span/2, m_wfData, m_fftbuf, &xmin, &xmax); // draw new line of fft data at top of waterfall bitmap painter1.setPen(QColor(0, 0, 0)); for (i = 0; i < xmin; i++) painter1.drawPoint(i,0); for (i = xmax; i < w; i++) painter1.drawPoint(i,0); for (i = xmin; i < xmax; i++) { painter1.setPen(m_ColorTbl[ 255-m_fftbuf[i] ]); painter1.drawPoint(i,0); } } // get/draw the 2D spectrum w = m_2DPixmap.width(); h = m_2DPixmap.height(); if ((w != 0) || (h != 0)) { // first copy into 2Dbitmap the overlay bitmap. m_2DPixmap = m_OverlayPixmap.copy(0,0,w,h); QPainter painter2(&m_2DPixmap); // workaround for "fixed" line drawing since Qt 5 // see http://stackoverflow.com/questions/16990326 #if QT_VERSION >= 0x050000 painter2.translate(0.5, 0.5); #endif // get new scaled fft data getScreenIntegerFFTData(h, qMin(w, MAX_SCREENSIZE), m_MaxdB, m_MindB, m_FftCenter - (qint64)m_Span/2, m_FftCenter + (qint64)m_Span/2, m_fftData, m_fftbuf, &xmin, &xmax); // draw the pandapter painter2.setPen(m_FftColor); n = xmax - xmin; for (i = 0; i < n; i++) { LineBuf[i].setX(i + xmin); LineBuf[i].setY(m_fftbuf[i + xmin]); } if (m_FftFill) { QLinearGradient linGrad(QPointF(xmin, h), QPointF(xmin, 0)); linGrad.setColorAt(0.0, m_FftCol0); linGrad.setColorAt(1.0, m_FftCol1); painter2.setBrush(QBrush(QGradient(linGrad))); if (n < MAX_SCREENSIZE-2) { LineBuf[n].setX(xmax-1); LineBuf[n].setY(h); LineBuf[n+1].setX(xmin); LineBuf[n+1].setY(h); painter2.drawPolygon(LineBuf, n+2); } else { LineBuf[MAX_SCREENSIZE-2].setX(xmax-1); LineBuf[MAX_SCREENSIZE-2].setY(h); LineBuf[MAX_SCREENSIZE-1].setX(xmin); LineBuf[MAX_SCREENSIZE-1].setY(h); painter2.drawPolygon(LineBuf, n); } } else { painter2.drawPolyline(LineBuf, n); } } // trigger a new paintEvent update(); }
////////////////////////////////////////////////////////////////////// // Called to update spectrum data for displaying on the screen ////////////////////////////////////////////////////////////////////// void CPlotter::draw() { int i,n; int w; int h; int xmin, xmax; if (m_DrawOverlay) { drawOverlay(); m_DrawOverlay = false; } QPoint LineBuf[MAX_SCREENSIZE]; if (!m_Running) return; // get/draw the waterfall w = m_WaterfallPixmap.width(); h = m_WaterfallPixmap.height(); // no need to draw if pixmap is invisible if ((w != 0) || (h != 0)) { // move current data down one line(must do before attaching a QPainter object) m_WaterfallPixmap.scroll(0,1,0,0, w, h); QPainter painter1(&m_WaterfallPixmap); // get scaled FFT data getScreenIntegerFFTData(255, qMin(w, MAX_SCREENSIZE), m_MaxdB, m_MindB, m_FftCenter - (qint64)m_Span/2, m_FftCenter + (qint64)m_Span/2, m_wfData, m_fftbuf, &xmin, &xmax); // draw new line of fft data at top of waterfall bitmap painter1.setPen(QColor(0, 0, 0)); for (i = 0; i < xmin; i++) painter1.drawPoint(i,0); for (i = xmax; i < w; i++) painter1.drawPoint(i,0); for (i = xmin; i < xmax; i++) { painter1.setPen(m_ColorTbl[ 255-m_fftbuf[i] ]); painter1.drawPoint(i,0); } } // get/draw the 2D spectrum w = m_2DPixmap.width(); h = m_2DPixmap.height(); if ((w != 0) || (h != 0)) { // first copy into 2Dbitmap the overlay bitmap. m_2DPixmap = m_OverlayPixmap.copy(0,0,w,h); QPainter painter2(&m_2DPixmap); // workaround for "fixed" line drawing since Qt 5 // see http://stackoverflow.com/questions/16990326 #if QT_VERSION >= 0x050000 painter2.translate(0.5, 0.5); #endif // get new scaled fft data getScreenIntegerFFTData(h, qMin(w, MAX_SCREENSIZE), m_MaxdB, m_MindB, m_FftCenter - (qint64)m_Span/2, m_FftCenter + (qint64)m_Span/2, m_fftData, m_fftbuf, &xmin, &xmax); // draw the pandapter painter2.setPen(m_FftColor); n = xmax - xmin; for (i = 0; i < n; i++) { LineBuf[i].setX(i + xmin); LineBuf[i].setY(m_fftbuf[i + xmin]); } if (m_FftFill) { QLinearGradient linGrad(QPointF(xmin, h), QPointF(xmin, 0)); linGrad.setColorAt(0.0, m_FftCol0); linGrad.setColorAt(1.0, m_FftCol1); painter2.setBrush(QBrush(QGradient(linGrad))); if (n < MAX_SCREENSIZE-2) { LineBuf[n].setX(xmax-1); LineBuf[n].setY(h); LineBuf[n+1].setX(xmin); LineBuf[n+1].setY(h); painter2.drawPolygon(LineBuf, n+2); } else { LineBuf[MAX_SCREENSIZE-2].setX(xmax-1); LineBuf[MAX_SCREENSIZE-2].setY(h); LineBuf[MAX_SCREENSIZE-1].setX(xmin); LineBuf[MAX_SCREENSIZE-1].setY(h); painter2.drawPolygon(LineBuf, n); } } else { painter2.drawPolyline(LineBuf, n); } //Peak detection if (m_PeakDetection > 0) { m_Peaks.clear(); float mean = 0; float sum_of_sq = 0; for (i = 0; i < n; i++) { mean += m_fftbuf[i + xmin]; sum_of_sq += m_fftbuf[i + xmin] * m_fftbuf[i + xmin]; } mean /= n; float stdev= sqrt( sum_of_sq/n-mean*mean ); int lastPeak=-1; for (i = 0; i < n; i++) { //m_PeakDetection times the std over the mean or better than current peak float d = (lastPeak==-1) ? (mean - m_PeakDetection * stdev) : m_fftbuf[lastPeak+xmin]; if (m_fftbuf[i + xmin] < d) lastPeak=i; if (lastPeak != -1 && (i - lastPeak > PEAK_H_TOLERANCE || i == n-1)) { m_Peaks.insert(lastPeak+xmin, m_fftbuf[lastPeak + xmin]); painter2.drawEllipse(lastPeak+xmin-5, m_fftbuf[lastPeak + xmin]-5, 10, 10); lastPeak=-1; } } } //Peak hold if (m_PeakHoldActive) { for (i = 0; i < n; i++) { if(!m_PeakHoldValid || m_fftbuf[i] < m_fftPeakHoldBuf[i]) m_fftPeakHoldBuf[i] = m_fftbuf[i]; LineBuf[i].setX(i + xmin); LineBuf[i].setY(m_fftPeakHoldBuf[i + xmin]); } painter2.setPen(m_PeakHoldColor); painter2.drawPolyline(LineBuf, n); m_PeakHoldValid=true; } painter2.end(); } // trigger a new paintEvent update(); }