this code redraw two rectangles, every 10ms.
its looks ugly.
ezgif-2422137665.gif
maybe need use some interpolation? if need, how to?

All project in attached file
TestQPainterSlowdrawing.zip


maybe have better solution for fast drawing?


mainwindow.cpp

Qt Code:
  1. #include "mainwindow.h"
  2. #include "ui_mainwindow.h"
  3. #include "qaudiolevel.h"
  4. #include <QThread>
  5. #include <QDebug>
  6.  
  7. QList<QAudioLevel*> audioLevels;
  8.  
  9. MainWindow::MainWindow(QWidget *parent) :
  10. QMainWindow(parent),
  11. ui(new Ui::MainWindow)
  12. {
  13. ui->setupUi(this);
  14. ui->levelsLayout->setSpacing(0);
  15.  
  16. for(int i=0;i<2;i++)
  17. {
  18. QAudioLevel *level = new QAudioLevel(ui->centralWidget);
  19. audioLevels.append(level);
  20. ui->levelsLayout->addWidget(level);
  21. }
  22. trs = new Threadl();
  23. connect(trs,SIGNAL(SetLevels()),this,SLOT(SetLevels()));
  24. trs->start();
  25.  
  26. }
  27.  
  28. MainWindow::~MainWindow()
  29. {
  30. delete ui;
  31. }
  32.  
  33. void MainWindow::SetLevels()
  34. {
  35. float val1=((0.26-0.21)*((float)rand()/RAND_MAX))+0.21;
  36. float val2=((0.26-0.21)*((float)rand()/RAND_MAX))+0.21;
  37. qDebug() << val1 << val2;
  38. audioLevels.at(0)->setLevel(val1);
  39. audioLevels.at(1)->setLevel(val2);
  40. }
  41.  
  42. void Threadl::run()
  43. {
  44. while(true)
  45. {
  46. emit SetLevels();
  47. QThread::msleep(10);
  48. }
  49. }
To copy to clipboard, switch view to plain text mode 


qpainter.cpp
Qt Code:
  1. #include "qaudiolevel.h"
  2. #include <QPainter>
  3. #include <QDebug>
  4.  
  5. QAudioLevel::QAudioLevel(QWidget *parent)
  6. : QWidget(parent)
  7. , m_level(0.0)
  8. {
  9. setMinimumHeight(15);
  10. setMaximumHeight(180);
  11. }
  12.  
  13. void QAudioLevel::setLevel(qreal level)
  14. {
  15. if (m_level != level) {
  16. m_level = level;
  17. update();
  18. }
  19. }
  20.  
  21. void QAudioLevel::paintEvent(QPaintEvent *event)
  22. {
  23. Q_UNUSED(event);
  24.  
  25. QPainter painter(this);
  26. qreal widthLevel = m_level * height();
  27. painter.fillRect(0,0, width(),height(), Qt::black);
  28. painter.fillRect(0,height()-widthLevel,50, height(), Qt::red);
  29.  
  30.  
  31.  
  32.  
  33. }
To copy to clipboard, switch view to plain text mode