PyQt5中的QListView.indexAt是否返回错误的索引?

2024-05-02 08:58:05 发布

您现在位置:Python中文网/ 问答频道 /正文

当用户右键单击QListView中的某个项目时,我试图弹出一个上下文菜单;如果用户右键单击任何项目(任何空格)之外,则弹出另一个上下文菜单。我发现在执行indexAt命令时接收到的索引不准确,我不知道为什么

我将QListView初始化为自己的类:

class RBKDataTypesTab(QWidget):
    def __init__(self):
        super().__init__()
        self.models = []
        grid = QGridLayout()
        self.list = QListView()
        self.list.clicked.connect(self.list_item_selected)
        grid.addWidget(self.list, 0, 0, -1, 8)
        self.table = QTableView()
        self.indexMenu = QMenu()
        self.indexMenu.addAction('Add DataType', self.addDataType)
        self.indexMenu.addAction('Remove DataType', self.removeDataType)
        self.nonIndexMenu = QMenu()
        self.nonIndexMenu.addAction('Add DataType', self.addDataType)
        grid.addWidget(self.table, 0, 2, -1, -1)
        self.setLayout(grid)

此时,列表为空。当打开一个文件来设置模型时,我还有其他的功能,它将数据加载到屏幕上

以下是我的上下文:

def contextMenuEvent(self, event):
    index = self.list.indexAt(event.pos())
    print(index.data())
    if(index.isValid()):
        event.accept()
        self.indexMenu.exec_(event.globalPos())
    else:
        event.accept()
        self.nonIndexMenu.exec_(event.globalPos())

假设我有三个通用项:

  • 项目1
  • 项目2
  • 项目3

多亏了print语句,当我在QListView中单击item1的前1/4时,我就知道它正在返回item1。但是,如果我单击item1的底部3/4,它将返回item2。对于item2和item3的逻辑相同,只有item3的底部3/4返回None,因此返回错误的上下文菜单

有人能帮我理解为什么会这样吗?我想这和event.pos()有关,但我不知道是什么

谢谢


Tags: 项目用户selfeventindex菜单listgrid
1条回答
网友
1楼 · 发布于 2024-05-02 08:58:05

event.pos()的坐标是关于拥有contextMenuEvent()方法的小部件的,在您的情况下,它是关于窗口的,但是indexAt()方法需要关于视图(QListView)的viewport()的坐标,因此您必须使用mapFromGlobal()方法进行转换:

def contextMenuEvent(self, event):
    gp = event.globalPos()
    lp = self.list.viewport().mapFromGlobal(gp)
    index = self.list.indexAt(lp)
    if index.isValid():
        self.indexMenu.exec_(gp)
    else:
        self.nonIndexMenu.exec_(gp)

相关问题 更多 >