1. 程式人生 > >QListView 新增右鍵選單

QListView 新增右鍵選單

效果圖

#include "widget.h"
#include "ui_widget.h"
#include <QCursor>
#include <QDebug>
#include <QListView>
#include <QStringList>
#include <QStringListModel>
#include <QPoint>
#include <QMenu>
#include <QListWidgetItem>

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new
Ui::Widget) { ui->setupUi(this); listview =new QListView(this); QStringList num; num<<"1"<<"2"<<"3"<<"4"; QStringListModel *model=new QStringListModel(num); listview->setModel(model); listview->setContextMenuPolicy(Qt::CustomContextMenu); connect(listview, SIGNAL(customContextMenuRequested(const
QPoint&)), this, SLOT(show_contextmenu1(const QPoint&))); //刪除測試 //全部刪除 //model->removeRows(0,model->rowCount()); //刪除第幾個,一共刪除多少個 //model->removeRows(0,3); } Widget::~Widget() { delete ui; } void Widget::show_contextmenu1(const QPoint& pos) { // if(cmenu)//保證同時只存在一個menu,及時釋放記憶體
// { // delete cmenu; // cmenu = NULL; // } qDebug()<<"show_contextmenu1"; QMenu *cmenu = new QMenu(listview); QAction *ascendSortAction = cmenu->addAction("升序"); QAction *descendSortAction = cmenu->addAction("降序"); QAction *filterAction = cmenu->addAction("過濾"); QAction *reshowAction = cmenu->addAction("過載"); connect(ascendSortAction, SIGNAL(triggered(bool)), this, SLOT(edit_menu1())); connect(descendSortAction, SIGNAL(triggered(bool)), this, SLOT(edit_menu2())); connect(filterAction, SIGNAL(triggered(bool)), this, SLOT(edit_menu3())); connect(reshowAction, SIGNAL(triggered(bool)), this, SLOT(edit_menu4())); cmenu->exec(QCursor::pos());//在當前滑鼠位置顯示 //cmenu->exec(pos)是在viewport顯示 }

上面程式碼右擊任何地方都會顯示選單,解決方法,增加一個if判斷,和清楚選中選項

//點選空白錯將不錯出現選單
    if(!((listview->selectionModel()->selectedIndexes()).empty()))
    {

        qDebug()<<"show_contextmenu1";
        QMenu *cmenu = new QMenu(listview);
        QAction *ascendSortAction = cmenu->addAction("升序");
        QAction *descendSortAction = cmenu->addAction("降序");
        QAction *filterAction = cmenu->addAction("過濾");
        QAction *reshowAction = cmenu->addAction("過載");
        connect(ascendSortAction, SIGNAL(triggered(bool)), this, SLOT(edit_menu1()));
        connect(descendSortAction, SIGNAL(triggered(bool)), this, SLOT(edit_menu2()));
        connect(filterAction, SIGNAL(triggered(bool)), this, SLOT(edit_menu3()));
        connect(reshowAction, SIGNAL(triggered(bool)), this, SLOT(edit_menu4()));
        cmenu->exec(QCursor::pos());//在當前滑鼠位置顯示
        //cmenu->exec(pos)是在viewport顯示

        //把選中的清楚
        listview->selectionModel()->clear();
    }