weixin_44228128 2023-04-27 21:11 采纳率: 0%
浏览 11

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

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

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-04-28 08:21
    关注
    不知道你这个问题是否已经解决, 如果还没有解决的话:
    • 以下回答来自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保存已经画好的图,可以实现更高效的在主线程中画图的方法。


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

报告相同问题?

问题事件

  • 创建了问题 4月27日

悬赏问题

  • ¥15 设计一个线控耳机音响系统满足以下全部功能
  • ¥60 求直线方程 使平面上n个点在直线同侧并且距离总和最小
  • ¥50 java算法,给定试题的难度数量(简单,普通,困难),和试题类型数量(单选,多选,判断),以及题库中各种类型的题有多少道,求能否随机抽题。
  • ¥50 rk3588板端推理
  • ¥250 opencv怎么去掉 数字0中间的斜杠。
  • ¥15 这种情况的伯德图和奈奎斯特曲线怎么分析?
  • ¥250 paddleocr带斜线的0很容易识别成9
  • ¥15 电子档案元素采集(tiff及PDF扫描图片)
  • ¥15 flink-sql-connector-rabbitmq使用
  • ¥15 zynq7015,PCIE读写延时偏大