網站首頁 編程語言 正文
本文實例為大家分享了Qt實現右擊菜單項的具體代碼,供大家參考,具體內容如下
有兩種方法:
- 自定義槽函數接受信號
- 使用鼠標事件監聽
一、前言
這里我用的是QTextEdit
來實現右鍵功能,假設我們的預期功能是:復制、粘貼、保存、關閉四個功能。
但是,我們在直接運行Qt后,發現右鍵已經有默認功能了,如圖:
如果有ui項目的話,進入ui的QTextEdit
組件,找到contextMenuPolicy
發現已經設置為DefaultContextMenu
。到此應該知道,Qt默認為我們創好了默認菜單。
查看Qt文檔可以證明我們的猜測是正確的。
Qt文檔中解釋了,默認屬性是Qt::DefaultContextMenu
,并且還有Qt::NoContextMenu
、Qt::PreventContextMenu
、Qt::ActionsContextMenu
、Qt::CustomContextMenu
。并且使用Qt::CustomContextMenu
時,會發射一個customContextMenuRequested()
信號。
這么一來,就很清晰了。
二、自定義槽函數接受信號
從上文可知,我們要想使用自定義方法。需要將屬性值改了,如果我們在QTextEdit中修改屬性,則
edit->setContextMenuPolicy(Qt::CustomContextMenu);
這樣一來,右鍵就不會出現默認選項了。
并對QTextEdit
連接了自定義槽函數,名稱自定
connect(edit,&QTextEdit::customContextMenuRequested,this,&Widget::ShowMenu);
這樣準備工作就完成了。
槽函數中我們需要創建一個菜單,并且添加選擇,這里使用QAction
。
再將QAction的成員連接個自功能,這樣就實現了基礎的菜單功能。
顯示的位置在光標位置處,所以使用QCursor::pos()
即可。
具體功能在槽函數里添加就行了。
void Widget::ShowMenu() { ? ? QMenu *menu = new QMenu(this); ? ? QStringList list; ? ? list << "copy" << "paste" << "save" << "close"; ? ? QList<QAction *> actList; ? ? for(int i = 0; i < list.count(); i ++) ? ? ? ? actList.append(new QAction(list.at(i))); ? ? connect(actList.at(0),&QAction::triggered,this,&Widget::CopyAction); ? ? connect(actList.at(1),&QAction::triggered,this,&Widget::PasteAction); ? ? connect(actList.at(2),&QAction::triggered,this,&Widget::SaveAction); ? ? connect(actList.at(3),&QAction::triggered,this,&Widget::CloseAction); ? ? menu->addActions(actList); ? ? menu->exec(QCursor::pos()); }
三、使用鼠標監聽
重寫
void mousePressEvent(QMouseEvent *event) override;
函數
需要判斷鼠標點擊事件是否是右擊,如果不,則直接返回,如果是,執行和方法一一樣的思路。
void Widget::mousePressEvent(QMouseEvent *event) { ? ? if(event->button() != Qt::RightButton) ? ? ? ? return; ? ? QMenu *menu = new QMenu(this); ? ? QStringList list; ? ? list << "copy" << "paste" << "save" << "close"; ? ? QList<QAction *> actList; ? ? for(int i = 0; i < list.count(); i ++) ? ? ? ? actList.append(new QAction(list.at(i))); ? ? connect(actList.at(0),&QAction::triggered,this,&Widget::CopyAction); ? ? connect(actList.at(1),&QAction::triggered,this,&Widget::PasteAction); ? ? connect(actList.at(2),&QAction::triggered,this,&Widget::SaveAction); ? ? connect(actList.at(3),&QAction::triggered,this,&Widget::CloseAction); ? ? menu->addActions(actList); ? ? menu->exec(QCursor::pos()); }
四、兩分法對比
方法一針對的是某個組件實現的菜單功能。比如我對界面中的edit1
組件使用了edit->setContextMenuPolicy(Qt::CustomContextMenu);
,那么edit1
就可以實現自定義功能。而edit2
、edit3
則沒有。
方法二是監聽鼠標事件,只要是右擊就出現菜單,對程序整個窗口內都有效,包括空白區域。
兩個方法實現的思路都是大同小異,在使用時看情況而分配吧。
原文鏈接:https://blog.csdn.net/yc__coder/article/details/107669928
相關推薦
- 2023-09-17 ES常見錯誤總結
- 2022-07-27 python?iloc和loc切片的實現_python
- 2022-07-06 C#winform中數據庫綁定DataGrid的實現_C#教程
- 2022-10-07 Go語言設計模式之實現觀察者模式解決代碼臃腫_Golang
- 2023-12-09 使用String.valueOf()的坑
- 2022-06-30 利用Python刪除電腦中重復文件的方法_python
- 2022-10-28 Python利用Rows快速操作csv文件_python
- 2022-07-15 Python標準庫之Math,Random模塊使用詳解_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支