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)
重寫
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)文章
基于OpenCV實(shí)現(xiàn)車道線檢測(cè)(自動(dòng)駕駛 機(jī)器視覺(jué))
無(wú)人駕駛技術(shù)是機(jī)器學(xué)習(xí)為主的一門前沿領(lǐng)域,在無(wú)人駕駛領(lǐng)域中機(jī)器學(xué)習(xí)的各種算法隨處可見(jiàn),本文將為大家介紹無(wú)人駕駛技術(shù)中的車道線檢測(cè),感興趣的小伙伴可以了解一下2021-11-11
C/C++代碼操作MySQL數(shù)據(jù)庫(kù)詳細(xì)步驟
這篇文章主要給大家介紹了關(guān)于C/C++代碼操作MySQL數(shù)據(jù)庫(kù)的相關(guān)資料,通過(guò)文中的這些示例,我們可以連接到MySQL數(shù)據(jù)庫(kù),并執(zhí)行常見(jiàn)的數(shù)據(jù)庫(kù)操作,如創(chuàng)建表、插入數(shù)據(jù)和查詢數(shù)據(jù),需要的朋友可以參考下2023-12-12
C語(yǔ)言循環(huán)隊(duì)列的表示與實(shí)現(xiàn)實(shí)例詳解
這篇文章主要介紹了C語(yǔ)言循環(huán)隊(duì)列的表示與實(shí)現(xiàn),對(duì)于數(shù)據(jù)結(jié)構(gòu)與算法的研究很有幫助,需要的朋友可以參考下2014-07-07
基于WTL 雙緩沖(double buffer)繪圖的分析詳解
本篇文章是對(duì)WTL下使用雙緩沖(double buffer)繪圖進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
利用C++如何實(shí)現(xiàn)一個(gè)阻塞隊(duì)列詳解
這篇文章主要給大家介紹了關(guān)于利用C++如何實(shí)現(xiàn)一個(gè)阻塞隊(duì)列的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10

