Qt子线程发动态数组到主线程画图

qt从子线程用emit发一个动态数组到主线程之后,qpainter能不能直接调用这个动态数组啊?现在的方法是用connet去触发一个getdata的函数,然后再定义一个全局的QVector去接收,再用update去触发qpainter画图,但是这样速度不够快,有什么解决方法吗?

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答来自chatgpt:

    首先,将动态数组传递到主线程可以使用Qt中的信号和槽机制实现,通过在子线程中使用emit信号将数组传递给主线程的槽函数,具体实现步骤如下:

    1.在子线程中定义一个信号,用于传递动态数组,比如:

    signals:
        void sendData(QVector<int> data);
    

    2.在子线程的某个函数中调用emit语句发送信号,将动态数组作为参数传递,比如:

    emit sendData(data);
    

    3.在主线程中使用connect函数连接到子线程的信号,并定义一个槽函数,用于接收动态数组,并将其存放到全局的QVector中,比如:

    connect(thread, SIGNAL(sendData(QVector<int>)), this, SLOT(receiveData(QVector<int>)));
    ...
    void receiveData(QVector<int> data)
    {
        globalData = data;
    }
    

    接下来是关于使用qpainter在主线程中画图的问题。可以在paintEvent函数中使用已经存放好的全局的QVector,进行画图。由于在paintEvent函数中进行画图是在主线程中进行的,不需要从子线程中传递数据,所以速度不会很慢。具体实现步骤如下:

    1.在paintEvent函数中使用QPainter进行画图,比如:

    void paintEvent(QPaintEvent *event)
    {
        QPainter painter(this);
        painter.setRenderHint(QPainter::Antialiasing);
        painter.setPen(Qt::red);
    
        for(int i=0; i<globalData.size(); i++) {
            painter.drawPoint(i, globalData[i]);
        }
    }
    

    这里以画点为例,可以根据实际需求使用其他函数进行画图。

    2.需要注意的是,如果动态数组的大小变化频繁,比如每秒钟都会有新的数据产生,为了实现更高效的画图,可以使用QPixmap来保存已经画好的图,然后在paintEvent中只需要绘制QPixmap即可。具体实现步骤如下:

    //定义全局变量
    QPixmap pixmap;
    bool isFirstTime = true;
    
    //在槽函数中处理数据,然后更新pixmap
    //注意pixmap的大小和背景颜色要和窗口一致
    void receiveData(QVector<int> data)
    {
        if(isFirstTime) {
            pixmap = QPixmap(this->size());
            pixmap.fill(Qt::white);
            isFirstTime = false;
        }
        QPainter painter(&pixmap);
        painter.setPen(Qt::red);
        //使用新数据更新pixmap
        //...
        update();
    }
    
    //在paintEvent中绘制pixmap
    void paintEvent(QPaintEvent *event)
    {
        QPainter painter(this);
        painter.setRenderHint(QPainter::Antialiasing);
        painter.drawPixmap(0, 0, pixmap);
    }
    

    这样可以减少在每次paintEvent中重新计算和绘制的时间,提高画图的效率。

    总的来说,通过信号和槽机制传递数组,并使用pixmap保存已经画好的图,可以实现更高效的在主线程中画图的方法。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^