Qt實(shí)現(xiàn)右擊菜單項(xiàng)
本文實(shí)例為大家分享了Qt實(shí)現(xiàn)右擊菜單項(xiàng)的具體代碼,供大家參考,具體內(nèi)容如下
有兩種方法:
- 自定義槽函數(shù)接受信號(hào)
- 使用鼠標(biāo)事件監(jiān)聽
一、前言
這里我用的是QTextEdit來實(shí)現(xiàn)右鍵功能,假設(shè)我們的預(yù)期功能是:復(fù)制、粘貼、保存、關(guān)閉四個(gè)功能。
但是,我們在直接運(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文檔可以證明我們的猜測是正確的。

Qt文檔中解釋了,默認(rèn)屬性是Qt::DefaultContextMenu,并且還有Qt::NoContextMenu、Qt::PreventContextMenu、Qt::ActionsContextMenu、Qt::CustomContextMenu。并且使用Qt::CustomContextMenu時(shí),會(huì)發(fā)射一個(gè)customContextMenuRequested()信號(hào)。
這么一來,就很清晰了。
二、自定義槽函數(shù)接受信號(hào)
從上文可知,我們要想使用自定義方法。需要將屬性值改了,如果我們在QTextEdit中修改屬性,則
edit->setContextMenuPolicy(Qt::CustomContextMenu);
這樣一來,右鍵就不會(huì)出現(xiàn)默認(rèn)選項(xiàng)了。
并對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)聽
重寫
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());
}四、兩分法對比
方法一針對的是某個(gè)組件實(shí)現(xiàn)的菜單功能。比如我對界面中的edit1組件使用了edit->setContextMenuPolicy(Qt::CustomContextMenu);,那么edit1就可以實(shí)現(xiàn)自定義功能。而edit2、edit3則沒有。
方法二是監(jiān)聽鼠標(biāo)事件,只要是右擊就出現(xiàn)菜單,對程序整個(gè)窗口內(nèi)都有效,包括空白區(qū)域。
兩個(gè)方法實(shí)現(xiàn)的思路都是大同小異,在使用時(shí)看情況而分配吧。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
基于OpenCV實(shí)現(xiàn)車道線檢測(自動(dòng)駕駛 機(jī)器視覺)
無人駕駛技術(shù)是機(jī)器學(xué)習(xí)為主的一門前沿領(lǐng)域,在無人駕駛領(lǐng)域中機(jī)器學(xué)習(xí)的各種算法隨處可見,本文將為大家介紹無人駕駛技術(shù)中的車道線檢測,感興趣的小伙伴可以了解一下2021-11-11
C/C++代碼操作MySQL數(shù)據(jù)庫詳細(xì)步驟
這篇文章主要給大家介紹了關(guān)于C/C++代碼操作MySQL數(shù)據(jù)庫的相關(guān)資料,通過文中的這些示例,我們可以連接到MySQL數(shù)據(jù)庫,并執(zhí)行常見的數(shù)據(jù)庫操作,如創(chuàng)建表、插入數(shù)據(jù)和查詢數(shù)據(jù),需要的朋友可以參考下2023-12-12
C語言循環(huán)隊(duì)列的表示與實(shí)現(xiàn)實(shí)例詳解
這篇文章主要介紹了C語言循環(huán)隊(duì)列的表示與實(shí)現(xiàn),對于數(shù)據(jù)結(jié)構(gòu)與算法的研究很有幫助,需要的朋友可以參考下2014-07-07
基于WTL 雙緩沖(double buffer)繪圖的分析詳解
本篇文章是對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)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10

