如何在qtableview python内部创建contextenu来删除行



下面是我正在使用的代码:如何在qtableview python内部创建contextenu来删除行。

即使我点击了Qbutton,它也显示了菜单,但我只需要在qtableview内部显示删除菜单。并让我知道删除qtableview数据行的方法。请告诉我解决方案。

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5 import uic
import sys
import sqlite3

class UI(QMainWindow):
def __init__(self):
super(UI, self).__init__()
uic.loadUi("tableview.ui", self)
self.show()
self.view_msa()
self.pushButton.clicked.connect(self.view_msa)

def view_msa(self):
self.model = QtGui.QStandardItemModel(self)
self.tableView.setModel(self.model)
conn = sqlite3.connect('book.db')
cur = conn.cursor()
cur.execute("SELECT * FROM card")
db_data = cur.fetchall()
print(db_data)
for line in db_data:
row = []
for item in line:
cell = QStandardItem(str(item))
row.append(cell)
self.model.setHorizontalHeaderLabels(["Name","Age","Gender"])
self.model.appendRow(row)
def contextMenuEvent(self, event):
self.click_menu = QtWidgets.QMenu()
renameAction = QtWidgets.QAction('Delete', self)
renameAction.triggered.connect(lambda: self.renameSlot(event))
self.click_menu.addAction(renameAction)
self.click_menu.popup(QtGui.QCursor.pos())
def renameSlot(self, event):
print("Renameing slot called")
app = QApplication(sys.argv)
window = UI()
app.exec_()

所有小部件都有contextMenuPolicy属性,如果设置为QtCore.Qt.CustomContextMenu,则可以连接到customContextMenuRequested(pos)信号(注意pos在小部件坐标中(。从那里,您可以通过indexAt访问位于鼠标位置的索引,或者更好地,获取selectedIndexes(如果启用了多选,这很有用(。

class UI(QMainWindow):
def __init__(self):
super(UI, self).__init__()
# ...
self.tableView.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
self.tableView.customContextMenuRequested.connect(self.tableMenu)
def tableMenu(self, pos):
selected = self.tableView.selectedIndexes()
if not selected:
return
menu = QtWidgets.QMenu()
deleteAction = menu.addAction('Delete rows')
deleteAction.triggered.connect(lambda: self.removeRows(selected))
menu.exec_(QtGui.QCursor.pos())
def removeRows(self, indexes):
# get unique row numbers
rows = set(index.row() for index in indexes)
# remove rows in *REVERSE* order!
for row in sorted(rows, reverse=True):
self.model.removeRow(row)

请注意,在这种情况下,您必须使用menu.exec()(这通常是首选方法(,而不是popup(),否则函数将立即返回,并且由于鼠标事件的内部处理,菜单可能不会显示:exec会阻塞,直到它返回(无论它的任何操作被触发还是关闭(,popup会立即返回。

最新更新