QT應用編程: QGraphicsTextItem單擊選中、雙擊進入編輯狀態

      網友投稿 1937 2025-04-02

      一、環境介紹


      操作系統介紹:win10 64位

      QT版本:?5.12.6

      二、功能介紹

      最近做一個播放器的項目,需要用戶自定義編輯定制視頻的字幕;為了方便編輯字幕,這里QGraphicsTextItem需要支持任意拖動,回車確認,鼠標雙擊進入編輯狀態,右鍵彈出菜單(剪切、復制、刪除、全選)等操作。

      實現思路: 重寫QGraphicsTextItem,重寫鼠標事件、鍵盤事件,完成功能定義。

      三、核心代碼

      #ifndef MY_GRAPHICSTEXTITEM_H

      #define MY_GRAPHICSTEXTITEM_H

      #include

      #include

      #include

      #include

      #include

      #include

      #include

      class my_graphicsTextItem: public QGraphicsTextItem

      {

      Q_OBJECT

      public:

      my_graphicsTextItem(QWidget *parent = nullptr){}

      ~my_graphicsTextItem(){}

      QString m_store_str;//用于保存

      signals:

      void EditStatus(bool);

      protected:

      void focusInEvent(QFocusEvent *event) override{

      if(event->reason() != Qt::PopupFocusReason){//注意右鍵菜單再次進入焦點時不保存原始文本

      m_store_str = toPlainText();//保存原始文本

      }

      QGraphicsTextItem::focusInEvent(event);

      }

      void focusOutEvent(QFocusEvent *event) override{

      if(event->reason() == Qt::MouseFocusReason && QApplication::mouseButtons()==Qt::RightButton)

      {

      //右鍵點擊其他地方失去焦點,定義為取消操作,恢復原始文本

      setPlainText(m_store_str);

      setTextInteractionFlags(Qt::NoTextInteraction);//恢復不能編輯狀態

      emit EditStatus(false);//編輯完成(發送信號出去)

      }

      else if(event->reason() == Qt::PopupFocusReason)

      {

      //右鍵彈出菜單時不做處理

      }

      QT應用編程: QGraphicsTextItem單擊選中、雙擊進入編輯狀態

      else

      { //其他情況,包括下面點擊回車的情況,編輯成功,發送信號給父對象

      setTextInteractionFlags(Qt::NoTextInteraction);

      emit EditStatus(false);//編輯完成(發送信號出去)

      }

      QGraphicsTextItem::focusOutEvent(event);

      }

      void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event)override{

      if(event->button() == Qt::LeftButton){//左鍵雙擊進入可編輯狀態并打開焦點

      emit EditStatus(true);//正在編輯

      setTextInteractionFlags(Qt::TextEditorInteraction);

      setFocus();

      QGraphicsTextItem::mouseDoubleClickEvent(event);

      }

      }

      void keyPressEvent(QKeyEvent *event) override{

      if(event->key() == Qt::Key_Return||event->key() == Qt::Key_Enter)

      {

      //點擊回車失去焦點,編輯完成,后續給FocusOutEvent處理

      clearFocus();

      }else{

      QGraphicsTextItem::keyPressEvent(event);

      }

      }

      };

      #endif // MY_GRAPHICSTEXTITEM_H

      Qt

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:excel表格內設置密碼保護的教程(excel表格怎么加密碼保護)
      下一篇:Excel VBA中讓你意想不到的陷阱
      相關文章
      久久精品国产亚洲av高清漫画| 日韩精品亚洲aⅴ在线影院| 亚洲色欲色欲www在线丝| gogo全球高清大胆亚洲| 亚洲视频在线免费| 另类专区另类专区亚洲| 苍井空亚洲精品AA片在线播放 | 中文日韩亚洲欧美制服| 亚洲AV无码专区在线播放中文 | 亚洲欧洲中文日韩久久AV乱码| 亚洲M码 欧洲S码SSS222| 亚洲 自拍 另类小说综合图区| 在线a亚洲v天堂网2018| 亚洲AV无码一区二区三区在线观看 | 亚洲开心婷婷中文字幕| 亚洲国产成人片在线观看无码 | 久久久久亚洲精品无码网址色欲 | 亚洲国产黄在线观看| 亚洲精品456播放| 亚洲JIZZJIZZ中国少妇中文| 亚洲无码黄色网址| 亚洲精品乱码久久久久66| 日本亚洲视频在线| 亚洲天天做日日做天天看 | 亚洲精品视频观看| 亚洲AV一宅男色影视| 无码久久精品国产亚洲Av影片| 老司机亚洲精品影院| 亚洲激情校园春色| 亚洲情A成黄在线观看动漫软件| 亚洲天然素人无码专区| 久久久久久亚洲av无码蜜芽| 亚洲人AV永久一区二区三区久久| 4338×亚洲全国最大色成网站| 亚洲午夜久久久久妓女影院 | 亚洲GV天堂GV无码男同| 亚洲国产午夜福利在线播放| 综合亚洲伊人午夜网 | 亚洲视频一区在线观看| 国产色在线|亚洲| 欧美日韩亚洲精品|