this->setFocusPolicy(Qt::NoFocus); this->setEditTriggers(QAbstractItemView::NoEditTriggers); this->setSelectionMode(QAbstractItemView::SingleSelection); this->setSelectionBehavior(QAbstractItemView::SelectRows); this->setContextMenuPolicy(Qt::CustomContextMenu); QMenu* m_menu = new QMenu(this); /* slot_function1()在"菜单项1"被点击时执行 slot_function2()在"菜单项2"被点击时执行 */ m_menu->addAction(u8"菜单项1", this, SLOT(slot_function1())); m_menu->addAction(u8"菜单项2", this, SLOT(slot_function2())); connect(this, &AbstractTableView::customContextMenuRequested,[=](const QPoint& pos){ //计算鼠标相对父窗口的位置 QPoint pt = this->parentWidget()->pos()+ pos + QPoint(30, 130); //判断鼠标右击位置是否是空白处,空白处则取消上一个选中焦点,不弹出菜单 QModelIndex index = indexAt(pos); if (!index.isValid()){ this->clearSelection(); return; } m_menu->exec(pt); });
如果项目中有多个TableView或者其他相同控件,都需要相同的右键菜单,则可以继承控件类,将这段代码添加在构造函数,其他控件继承自此控件。