1

在这个论坛的访问者的帮助下,我在 QListWidget 中制作了一个自定义上下文菜单。现在我试图解决一个问题,即当用户右键单击小部件但鼠标没有悬停在任何项目上时菜单正在显示。当这种情况发生时,我希望菜单不显示。我一直在考虑明显的情况 - 鼠标是否悬停在小部件中的某个项目上?但我不知道该怎么做。预先感谢您的所有答案:)

4

1 回答 1

4

由于您没有显示当前如何创建上下文菜单,因此我将从一开始就假设...

  1. 将小部件的contextMenuPolicy设置为Qt::CustomContextMenu

  2. 将小部件customContextMenuRequested信号连接到将显示您的自定义菜单的插槽

  3. 插槽将在本地小部件坐标中接收 QPoint。您可以使用此 QPoint 通过QListWidget.itemAt(QPoint)找出该点下方的项目。然后,您可以验证该指针。如果它是有效的项目,请在该点显示您的菜单(或一些适合您的偏移量)。有效项表示非空指针。

这是 PyQt 中的示例。你可以把它翻译成 Qt

class Widget(QtGui.QWidget):

    def __init__(self,parent=None):
        super(Widget, self).__init__(parent)

        self.list = QtGui.QListWidget()
        self.list.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
        self.list.customContextMenuRequested.connect(self.handleContext)

        layout = QtGui.QVBoxLayout(self)
        layout.addWidget(self.list)

        self.list.addItems(["one", "two"])

    def handleContext(self, pos):
        item = self.list.itemAt(pos)
        if item is not None:
            menu = QtGui.QMenu("Context Menu", self)
            menu.addAction("FOO")
            ret = menu.exec_(self.list.mapToGlobal(pos))

在 PyQt4 中,如果给定位置的项目是None,那么它是一个空白空间。在 Qt 中,它应该是一个空指针。

于 2012-11-24T00:26:07.680 回答