Skip to main content
标签ad报错:该广告ID(9)不存在。
  主页 > Qt入门

一个Qt/C++ Demo,用于实现一个用于显示波形图的控件效果

2023-04-23 浏览:
标签ad报错:该广告ID(7)不存在。 Code Demo

    #pragma once

    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    
    class WaveformWidget : public QWidget {
        Q_OBJECT
    public:
        explicit WaveformWidget(QWidget* parent = nullptr) :
            QWidget(parent),
            m_data(1000, 0),
            m_pixmap(QSize(1000, 300)),
            m_timer(new QTimer(this))
        {
            // 设置定时器,控制波形图的刷新速度
            m_timer->setInterval(50);
            connect(m_timer, &QTimer::timeout, this, &WaveformWidget::onTimeout);
    
            QHBoxLayout* layout = new QHBoxLayout();
            QLabel* label = new QLabel();
            layout->addWidget(label);
            setLayout(layout);
            m_label = label;
        }
    
        ~WaveformWidget() override {
            delete m_timer;
        }
    
        void start() {
            m_timer->start();
        }
    
        void stop() {
            m_timer->stop();
        }
    
    private:
        void paintEvent(QPaintEvent* event) override {
            QPainter painter(this);
            painter.drawPixmap(rect(), m_pixmap);
        }
    
        void onTimeout() {
            // 更新数据
            for (int i = 1; i < m_data.size(); ++i) {
                m_data[i - 1] = m_data[i];
            }
            m_data[m_data.size() - 1] = rand() % 200;
    
            // 更新图像
            QPixmap oldPixmap = m_pixmap;
            QPainter painter(&m_pixmap);
            painter.fillRect(m_pixmap.rect(), Qt::black);
            QColor color(0, 255, 0);
            painter.setPen(color);
            QPoint prevPoint(-1, -1);
            for (int i = 0; i < m_data.size(); ++i) {
                int x = i;
                int y = 300 - m_data[i];
                QPoint point(x, y);
                if (prevPoint.x() != -1) {
                    painter.drawLine(prevPoint, point);
                }
                prevPoint = point;
            }
    
            if (oldPixmap.size() != m_pixmap.size()) {
                m_label->setFixedSize(m_pixmap.size());
            }
            m_label->setPixmap(m_pixmap);
    
            update();
        }
    
    private:
        QVector m_data;
        QPixmap m_pixmap;
        QTimer* m_timer;
        QLabel* m_label;
    };