QT應用編程: QGraphicsTextItem單擊選中、雙擊進入編輯狀態
一、環境介紹

操作系統介紹: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)
{
//右鍵彈出菜單時不做處理
}
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小時內刪除侵權內容。