Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在多个QtableView上创建不同的上下文菜单_Python_Pyqt5_Contextmenu_Qtableview - Fatal编程技术网

Python 在多个QtableView上创建不同的上下文菜单

Python 在多个QtableView上创建不同的上下文菜单,python,pyqt5,contextmenu,qtableview,Python,Pyqt5,Contextmenu,Qtableview,我在QMainWindow中有两个QTableViews,我想在其中一个上创建上下文菜单,然后在另一个上创建另一个上下文菜单 到目前为止,创建上下文菜单和定义操作仍然有效。但是上下文菜单会在整个应用程序中的任何地方弹出。我不知道如何将它限制在一个特定的表中。我认为这与contextMenuEvent()有关,它是QMainWindow的成员,但我不知道如何更改此部分。尝试创建继承QTableView的自定义类无效,因为我不确定从何处开始 以下是我尝试过的: populate\u table\u

我在
QMainWindow
中有两个
QTableView
s,我想在其中一个上创建上下文菜单,然后在另一个上创建另一个上下文菜单

到目前为止,创建上下文菜单和定义操作仍然有效。但是上下文菜单会在整个应用程序中的任何地方弹出。我不知道如何将它限制在一个特定的表中。我认为这与
contextMenuEvent()
有关,它是
QMainWindow
的成员,但我不知道如何更改此部分。尝试创建继承
QTableView
的自定义类无效,因为我不确定从何处开始

以下是我尝试过的:

populate\u table\u 1()
populate\u table\u 2()
方法仅用于将某些数据填充到表中。
get\u selected\u item\u TV1()
方法从
表1的一行中获取必要的数据。
delete\u file()
方法是从
contextMenuEvent()
方法调用delete操作时需要执行的一个示例。到目前为止,这段代码仍然有效,但我希望只有在右键单击
表1
的行时,上下文菜单才会弹出,并且在其他地方右键单击时,上下文菜单根本不会出现

从PyQt5.QtGui导入*
从PyQt5.QtWidgets导入*
从PyQt5.QtCore导入*
数据1=[“文件名”,“文件信息”]
数据_2=[“其他_材料_1”,“其他_材料_2”]
类Ui_主窗口(QMainWindow):
定义初始化(自):
super()。\uuuu init\uuuuu()
self.initUI()
def initUI(self):
self.setWindowTitle(“MyApp”)
自我调整大小(450280)
centralwidget=QWidget(自身)
#]===================================================================[#
#表1
表1=QTableView(
中央Widget,
selectionBehavior=QAbstractItemView.SelectRows,
editTriggers=QAbstractItemView.NoEditTriggers
)
#表1型号
self.modelTV1=QStandardItemModel(0,2,centralwidget)
self.modelTV1.setHorizontalHeaderLabels([“第1列”、“第2列”])
表1.setModel(self.modelTV1)
self.selectionModelTV1=表_1.selectionModel()
#]===================================================================[#
#表2
表2=QTableView(
中央Widget,
selectionBehavior=QAbstractItemView.SelectRows,
editTriggers=QAbstractItemView.NoEditTriggers,
)
#表2模型
self.modelTV2=QStandardItemModel(0,2,centralwidget)
self.modelTV2.setHorizontalHeaderLabels([“第1列”、“第2列”])
表2.setModel(self.modelTV2)
self.selectionModelTV2=表2.selectionModel()
v_Layout1=QVBoxLayout()
v_布局1.addWidget(表_1)
v_布局1.addWidget(表2)
gridLayout=QGridLayout(centralwidget)
addLayout(v_布局1,0,0,1,1)
self.setCentralWidget(centralwidget)
def填充表1(自身):
self.modelTV1.setRowCount(0)
对于数据_1中的项目:
self.modelTV1.insertRow(0)
对于i,枚举中的文本(数据_1):
self.modelTV1.setItem(0,i,QStandardItem(文本))
def填充表2(自身):
self.modelTV2.setRowCount(0)
对于数据_2中的项目:
self.modelTV2.insertRow(0)
对于i,枚举中的文本(数据_2):
self.modelTV2.setItem(0,i,QStandardItem(文本))
def contextMenuEvent(自身、事件):
self.contextMenu=QMenu(self)
deleteAction=QAction(“删除”,自我)
self.contextMenu.addAction(deleteAction)
deleteAction.triggered.connect(lambda:self.delete_文件(事件))
self.contextMenu.popup(QCursor.pos())
def get_selected_项目_TV1(自身):
#从表1的第一列获取行的文本
列出的项目=self.selectionModelTV1.selectedRows()
对于列出的项目中的索引:
所选项目=index.data()
返回f“表1-行{index.row()}-{selected\u item}”
def delete_文件(自身、事件):
item=self.get\u selected\u item\u TV1()
打印(f“删除:{item}”)
如果名称=“\uuuuu main\uuuuuuuu”:
导入系统
app=QApplication(sys.argv)
mainUI=Ui\u主窗口()
mainUI.populate_table_1()
mainUI.populate_table_2()
mainUI.show()
sys.exit(app.exec_())

有很多选择:

  • 当按下鼠标时,检测它是否位于特定区域,例如第一个QTableView。在这种情况下,小部件必须可以在contextMenuEvent()中访问,因此您必须将
    表1
    更改为
    自身。表1
    ,然后使用鼠标下()

    def contextMenuEvent(self,event):
    如果self.table_1.underMouse():
    self.contextMenu=QMenu(self)
    deleteAction=QAction(“删除”,自我)
    self.contextMenu.addAction(deleteAction)
    deleteAction.triggered.connect(lambda:self.delete_文件(事件))
    self.contextMenu.popup(QCursor.pos())
    
  • 为每个QTableView实现contextMenuEvent方法:

    class表视图(QTableView):
    def contextMenuEvent(自身、事件):
    self.contextMenu=QMenu(self)
    deleteAction=QAction(“删除”,自我)
    self.contextMenu.addAction(deleteAction)
    deleteAction.triggered.connect(lambda:self.delete_文件(事件))
    self.contextMenu.popup(QCursor.pos())
    def get_selected_项目_TV1(自身):
    #从表1的第一列获取行的文本
    列出的项目=self.selectionModel().selectedRows()
    对于列出的项目中的索引:
    所选项目=index.data()
    返回f“表1-行{index.row()}-{selected\u item}”
    def delete_文件(自身、事件):
    item=self.get\u selected\u item\u TV1()
    打印(f“删除:{item}”)
    
    然后您必须更改
    table_1=QTableView(…