首頁 > 軟體

Qt實現右擊選單項

2022-08-09 14:03:09

本文範例為大家分享了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則沒有。

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

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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com