日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

Qt實現右擊菜單項_C 語言

作者:巨蟹賊香 ? 更新時間: 2022-10-04 編程語言

本文實例為大家分享了Qt實現右擊菜單項的具體代碼,供大家參考,具體內容如下

有兩種方法:

  • 自定義槽函數接受信號
  • 使用鼠標事件監聽

一、前言

這里我用的是QTextEdit來實現右鍵功能,假設我們的預期功能是:復制、粘貼、保存、關閉四個功能。

但是,我們在直接運行Qt后,發現右鍵已經有默認功能了,如圖:

如果有ui項目的話,進入ui的QTextEdit組件,找到contextMenuPolicy發現已經設置為DefaultContextMenu。到此應該知道,Qt默認為我們創好了默認菜單。

查看Qt文檔可以證明我們的猜測是正確的。

Qt文檔中解釋了,默認屬性是Qt::DefaultContextMenu,并且還有Qt::NoContextMenuQt::PreventContextMenuQt::ActionsContextMenuQt::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就可以實現自定義功能。而edit2edit3則沒有。

方法二是監聽鼠標事件,只要是右擊就出現菜單,對程序整個窗口內都有效,包括空白區域。

兩個方法實現的思路都是大同小異,在使用時看情況而分配吧。

原文鏈接:https://blog.csdn.net/yc__coder/article/details/107669928

欄目分類
最近更新