<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      解決Qt重繪事件中進(jìn)行了耗時(shí)的圖片操作導(dǎo)致卡頓問題

      先簡單描述一下我出現(xiàn)的問題,我是在寫一個(gè)聊天界面,然后對(duì)于圖片消息來說,一旦圖片比較大時(shí),滑動(dòng)聊天界面就會(huì)出現(xiàn)了明顯卡頓情況,原因是和我在寫這個(gè)ImageMessage時(shí)直接在paintEvent中就進(jìn)行了耗時(shí)的圖片操作,也是我對(duì)于重繪事件的不夠了解導(dǎo)致的
      c++ - Stabilize QWidget::paintEvent() calls frequency - Stack Overflow

      QWidget Class | Qt Widgets | Qt 6.9.1中可以看到.大致告訴我們?cè)趐aintEvent中不要進(jìn)行一些其他的操作,他只負(fù)責(zé)繪制.

      image-20250823102156915

      我這個(gè)MessageImage就是左下角這個(gè)長矩形,有點(diǎn)難度的地方在這個(gè)如何計(jì)算圖片放置的位置,需要用到父元素來計(jì)算,我在解決卡頓時(shí)把updateUi從paintEvent直接提出來就出現(xiàn)了父元素為NULL,因?yàn)槲沂褂肕essageImage沒有直接傳父元素給構(gòu)造函數(shù),而是先創(chuàng)建在放入layout中,也就導(dǎo)致了更新ui時(shí)出現(xiàn)父元素為空的情況,然后我采用的是新增一個(gè)字段表示是否完成ui更新,updateUI將state設(shè)置為false__updateUi在父元素為空時(shí)會(huì)直接返回沒有更新圖片和state,然后讓showEvent去再判斷是否成功了,沒成功再執(zhí)行 一次 updateUi,這樣就將原本卡頓的顯示解決了.

      20250826
      今天重新查看,發(fā)現(xiàn)有個(gè)問題resize后氣泡和圖片沒有更新,所以需要給resizeEvent中新增__updateui

      class MessageImage : public QWidget {
      	Q_OBJECT
      public:
      	MessageImage(const QString& fileId,const QByteArray& content, bool isLeft);
      	void updateUI(const QString& fileId, const QByteArray& content);
      
      protected:
      	void paintEvent(QPaintEvent* event) override;
          void showEvent(QShowEvent* event) override;
          void resizeEvent(QResizeEvent* event) override;
      private:
          void __updateUi();
      private:
      	QPushButton* image;
      	QString fileId;
          QPixmap image_pixmap;
      	bool isLeft;
          bool state; // 0 -- 未更新 
      };
      //==========================================================================================
      MessageImage::MessageImage(const QString& fileId, const QByteArray& content, bool isLeft)
      	:isLeft(isLeft),fileId(fileId),state(false)
      {
      	this->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding));
      	this->setStyleSheet("QPushButton{border:none;} QWidget{background-color:red}");
          image = new QPushButton(this);
          if (content.isEmpty()) {
      		model::DataCenter* dataCenter = model::DataCenter::getInstance();
      		connect(dataCenter, &model::DataCenter::getSingleFileDone, this,&MessageImage::updateUI,Qt::UniqueConnection);
      		dataCenter->getSingleFileAsync(fileId);
          }
          else {
              updateUI(fileId, content);
          }
      }
      void MessageImage::updateUI(const QString& fileId, const QByteArray& content)
      {
          if (this->fileId.isEmpty() || content.isEmpty()) {
              return;
          }
          this->fileId = fileId;
          __scaledImageToWidth(content, image_pixmap);
          this->state = false;
          __updateUi();
      	this->update();
      
      }
      void MessageImage::showEvent(QShowEvent* event)
      {
          QWidget::showEvent(event);
          if (!state) {
              __updateUi();  
          }
      }
      void MessageImage::paintEvent(QPaintEvent* event)
      {
          Q_UNUSED(event);
          QWidget::paintEvent(event);
      }
      void MessageImage::resizeEvent(QResizeEvent* event)
      {
          QWidget::resizeEvent(event);
      	__updateUi();
      }
      void __scaledImageToWidth(const QByteArray& body,__out QPixmap& pixmap) {
          pixmap.loadFromData(body);
          pixmap = pixmap.scaledToWidth(120, Qt::SmoothTransformation);
      }
      void MessageImage::__updateUi() {
          QObject* obj = this->parent();
          if (obj == nullptr || !obj->isWidgetType()) {
              return;
          }
          QWidget* parent = dynamic_cast<QWidget*> (obj);
          if (image_pixmap.isNull()) {
              image_pixmap.load(":/resource/images/xiaoju.jpg");
          }
          QRect r = image_pixmap.rect();
          qDebug() << "image rect " << r;
          parent->setMinimumHeight(r.height() + 30);
          image->setIconSize(QSize(r.width(), r.height()));
          image->setIcon(QIcon(image_pixmap));
          if (isLeft) {
              image->setGeometry(0, 0, r.width(), r.height());
          }
          else {
              image->setGeometry(parent->width() - r.width() - 65, 0, r.width(), r.height());
          }
          this->state = true;
      }
      
      posted @ 2025-08-23 10:48  haoyouxiaoju  閱讀(55)  評(píng)論(0)    收藏  舉報(bào)
      主站蜘蛛池模板: 成人精品自拍视频免费看| 亚洲第一国产综合| 亚洲码与欧洲码区别入口| 中文字幕无码免费久久| 欧美性受xxxx黑人猛交| 亚洲综合网中文字幕在线| 日本偷拍自影像视频久久| 成人午夜免费无码视频在线观看| 亚洲国产午夜福利精品| 免费看欧美日韩一区二区三区| 久久99国产精品久久99小说| 定陶县| 亚洲国产成人综合自在线| 日本福利一区二区精品| 超碰人人超碰人人| 人妻无码久久久久久久久久久| 蜜臀午夜一区二区在线播放| 日本久久久www成人免费毛片丨| 国产欧美日韩精品丝袜高跟鞋| 国色天香中文字幕在线视频| 亚洲高清WWW色好看美女| 女人18片毛片60分钟| 亚洲五月天一区二区三区| 亚洲av无码乱码在线观看野外| 国产精品欧美一区二区三区不卡| 国产色婷婷亚洲99精品小说| 亚洲自拍偷拍福利小视频| 无码中文字幕热热久久| 人人玩人人添人人澡超碰| 久久狠狠高潮亚洲精品夜色| 日本视频一两二两三区| 国产免费一区二区三区在线观看| 精品国产一区二区三区大| yy111111在线尤物| 亚洲日本精品一区二区| 亚洲精品乱码久久久久久中文字幕| 亚洲AV毛片一区二区三区| 免费AV片在线观看网址| 国产国语一级毛片| 欲乱人妻少妇邻居毛片| 无码福利写真片视频在线播放|