当用户右键单击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())
假设我有三个通用项:
多亏了print语句,当我在QListView中单击item1的前1/4时,我就知道它正在返回item1。但是,如果我单击item1的底部3/4,它将返回item2。对于item2和item3的逻辑相同,只有item3的底部3/4返回None,因此返回错误的上下文菜单
有人能帮我理解为什么会这样吗?我想这和event.pos()有关,但我不知道是什么
谢谢
event.pos()
的坐标是关于拥有contextMenuEvent()
方法的小部件的,在您的情况下,它是关于窗口的,但是indexAt()
方法需要关于视图(QListView)的viewport()
的坐标,因此您必须使用mapFromGlobal()
方法进行转换:相关问题 更多 >
编程相关推荐