Qt實(shí)現(xiàn)右擊菜單項(xiàng)
本文實(shí)例為大家分享了Qt實(shí)現(xiàn)右擊菜單項(xiàng)的具體代碼,供大家參考,具體內(nèi)容如下
有兩種方法:
- 自定義槽函數(shù)接受信號(hào)
- 使用鼠標(biāo)事件監(jiān)聽(tīng)
一、前言
這里我用的是QTextEdit
來(lái)實(shí)現(xiàn)右鍵功能,假設(shè)我們的預(yù)期功能是:復(fù)制、粘貼、保存、關(guān)閉四個(gè)功能。
但是,我們?cè)谥苯舆\(yùn)行Qt后,發(fā)現(xiàn)右鍵已經(jīng)有默認(rèn)功能了,如圖:
如果有ui項(xiàng)目的話,進(jìn)入ui的QTextEdit
組件,找到contextMenuPolicy
發(fā)現(xiàn)已經(jīng)設(shè)置為DefaultContextMenu
。到此應(yīng)該知道,Qt默認(rèn)為我們創(chuàng)好了默認(rèn)菜單。
查看Qt文檔可以證明我們的猜測(cè)是正確的。
Qt文檔中解釋了,默認(rèn)屬性是Qt::DefaultContextMenu
,并且還有Qt::NoContextMenu
、Qt::PreventContextMenu
、Qt::ActionsContextMenu
、Qt::CustomContextMenu
。并且使用Qt::CustomContextMenu
時(shí),會(huì)發(fā)射一個(gè)customContextMenuRequested()
信號(hào)。
這么一來(lái),就很清晰了。
二、自定義槽函數(shù)接受信號(hào)
從上文可知,我們要想使用自定義方法。需要將屬性值改了,如果我們?cè)赒TextEdit中修改屬性,則
edit->setContextMenuPolicy(Qt::CustomContextMenu);
這樣一來(lái),右鍵就不會(huì)出現(xiàn)默認(rèn)選項(xiàng)了。
并對(duì)QTextEdit
連接了自定義槽函數(shù),名稱自定
connect(edit,&QTextEdit::customContextMenuRequested,this,&Widget::ShowMenu);
這樣準(zhǔn)備工作就完成了。
槽函數(shù)中我們需要?jiǎng)?chuàng)建一個(gè)菜單,并且添加選擇,這里使用QAction
。
再將QAction的成員連接個(gè)自功能,這樣就實(shí)現(xiàn)了基礎(chǔ)的菜單功能。
顯示的位置在光標(biāo)位置處,所以使用QCursor::pos()
即可。
具體功能在槽函數(shù)里添加就行了。
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()); }
三、使用鼠標(biāo)監(jiān)聽(tīng)
重寫(xiě)
void mousePressEvent(QMouseEvent *event) override;
函數(shù)
需要判斷鼠標(biāo)點(diǎn)擊事件是否是右擊,如果不,則直接返回,如果是,執(zhí)行和方法一一樣的思路。
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()); }
四、兩分法對(duì)比
方法一針對(duì)的是某個(gè)組件實(shí)現(xiàn)的菜單功能。比如我對(duì)界面中的edit1
組件使用了edit->setContextMenuPolicy(Qt::CustomContextMenu);
,那么edit1
就可以實(shí)現(xiàn)自定義功能。而edit2
、edit3
則沒(méi)有。
方法二是監(jiān)聽(tīng)鼠標(biāo)事件,只要是右擊就出現(xiàn)菜單,對(duì)程序整個(gè)窗口內(nèi)都有效,包括空白區(qū)域。
兩個(gè)方法實(shí)現(xiàn)的思路都是大同小異,在使用時(shí)看情況而分配吧。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C語(yǔ)言之sizeof與strlen的使用及區(qū)別
這篇文章主要介紹了C語(yǔ)言之sizeof與strlen的使用及區(qū)別,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07C++實(shí)現(xiàn)LeetCode(59.螺旋矩陣之二)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(59.螺旋矩陣之二),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07C++實(shí)現(xiàn)json形式的Socket傳輸圖片
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)json形式的Socket傳輸圖片,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-03-03C++求所有頂點(diǎn)之間的最短路徑(用Floyd算法)
這篇文章主要為大家詳細(xì)介紹了C++求所有頂點(diǎn)之間的最短路徑,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-04-04C語(yǔ)言中循環(huán)語(yǔ)句練習(xí)實(shí)例
大家好,本篇文章主要講的是C語(yǔ)言中循環(huán)語(yǔ)句練習(xí)實(shí)例,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下2022-01-01C++設(shè)計(jì)模式編程中簡(jiǎn)單工廠與工廠方法模式的實(shí)例對(duì)比
這篇文章主要介紹了C++設(shè)計(jì)模式編程中簡(jiǎn)單工廠與工廠方法模式的實(shí)例對(duì)比,文中最后對(duì)兩種模式的優(yōu)缺點(diǎn)總結(jié)也比較詳細(xì),需要的朋友可以參考下2016-03-03