qt QTextEdit選中內容拖拽時的滑鼠樣式無法設定問題

蔡头一枚發表於2024-03-21

背景:專案中要實現對QTextEdit裡面選中的文字選中後進行拖拽處理, 但是無論設定哪個物件的滑鼠樣式,都無法生效,都會報一下這個

後面檢視這個19的對應的滑鼠樣式,是DragCopyCursor這個列舉值,原因可能是QTextEdit在選中文字之後拖動時認為是複製的動作; 實際上在拖動選中的文字時,QTextEdit內部qt_scrollarea_viewport生成了一個QDrag物件,而且這個動作是Qt::CopyAction,因此想要改變拖拽的滑鼠樣式,需要取它裡面的子物件中型別是QDrag出來,並且對其檢查進行setDragCursor操作即可; 部分程式碼如下:

            // 由於QTextEdit 在拖拽時內部會生成QDrag物件,並且滑鼠樣式是內部的QDrag物件自己設定,因此想要設定自定義滑鼠樣式,需要找到源物件中的QDrag物件,並且進行修改複製的滑鼠樣式(因為是複製操作,所以修改的是CopyAction
            // 其他可根據動作型別選擇後面的引數 (其他拖拽時可以選擇外部生成QDrag物件,並且設定拖拽滑鼠樣式)
            QDrag *pDrag = (event->source())->findChild<QDrag *>();
            if ( pDrag )
                pDrag->setDragCursor(QPixmap(":/Image/Common/icon_openhand.png"), Qt::CopyAction);

其中, event為QDropEvent型別,透過它可以找到拖動的來源物件是哪個; 一般這個設定在進入DragEnterEvent裡面處理;

另外注意的是, 避免QTextEdit重複觸發外面主窗體的DragEnterEvent事件,需要設定禁止本身拖拽屬性

m_pTextEdit->setAcceptDrops(false);             // 禁止本身接受拖拽
m_pTextEdit為以上操作的目標;

相關文章