Qt實現(xiàn)右擊菜單項
本文實例為大家分享了Qt實現(xiàn)右擊菜單項的具體代碼,供大家參考,具體內(nèi)容如下
有兩種方法:
- 自定義槽函數(shù)接受信號
- 使用鼠標事件監(jiān)聽
一、前言
這里我用的是QTextEdit來實現(xiàn)右鍵功能,假設(shè)我們的預(yù)期功能是:復(fù)制、粘貼、保存、關(guān)閉四個功能。
但是,我們在直接運行Qt后,發(fā)現(xiàn)右鍵已經(jīng)有默認功能了,如圖:

如果有ui項目的話,進入ui的QTextEdit組件,找到contextMenuPolicy發(fā)現(xiàn)已經(jīng)設(shè)置為DefaultContextMenu。到此應(yīng)該知道,Qt默認為我們創(chuàng)好了默認菜單。
查看Qt文檔可以證明我們的猜測是正確的。

Qt文檔中解釋了,默認屬性是Qt::DefaultContextMenu,并且還有Qt::NoContextMenu、Qt::PreventContextMenu、Qt::ActionsContextMenu、Qt::CustomContextMenu。并且使用Qt::CustomContextMenu時,會發(fā)射一個customContextMenuRequested()信號。
這么一來,就很清晰了。
二、自定義槽函數(shù)接受信號
從上文可知,我們要想使用自定義方法。需要將屬性值改了,如果我們在QTextEdit中修改屬性,則
edit->setContextMenuPolicy(Qt::CustomContextMenu);
這樣一來,右鍵就不會出現(xiàn)默認選項了。
并對QTextEdit連接了自定義槽函數(shù),名稱自定
connect(edit,&QTextEdit::customContextMenuRequested,this,&Widget::ShowMenu);
這樣準備工作就完成了。
槽函數(shù)中我們需要創(chuàng)建一個菜單,并且添加選擇,這里使用QAction。
再將QAction的成員連接個自功能,這樣就實現(xiàn)了基礎(chǔ)的菜單功能。
顯示的位置在光標位置處,所以使用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());
}三、使用鼠標監(jiān)聽
重寫
void mousePressEvent(QMouseEvent *event) override;
函數(shù)
需要判斷鼠標點擊事件是否是右擊,如果不,則直接返回,如果是,執(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());
}四、兩分法對比
方法一針對的是某個組件實現(xiàn)的菜單功能。比如我對界面中的edit1組件使用了edit->setContextMenuPolicy(Qt::CustomContextMenu);,那么edit1就可以實現(xiàn)自定義功能。而edit2、edit3則沒有。
方法二是監(jiān)聽鼠標事件,只要是右擊就出現(xiàn)菜單,對程序整個窗口內(nèi)都有效,包括空白區(qū)域。
兩個方法實現(xiàn)的思路都是大同小異,在使用時看情況而分配吧。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C++實現(xiàn)LeetCode(59.螺旋矩陣之二)
這篇文章主要介紹了C++實現(xiàn)LeetCode(59.螺旋矩陣之二),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下2021-07-07
C++設(shè)計模式編程中簡單工廠與工廠方法模式的實例對比
這篇文章主要介紹了C++設(shè)計模式編程中簡單工廠與工廠方法模式的實例對比,文中最后對兩種模式的優(yōu)缺點總結(jié)也比較詳細,需要的朋友可以參考下2016-03-03

