I want to add a right click menu to delete, rename or open image in each of cell of QTAbleView in the rigt click menu, I have tried and found everyone is trying to add menu to a header in tableview, i tried below but that seems not working in the code below..
class GalleryUi(QtGui.QTableView):
""" Class contains the methods that forms the
UI of Image galery
"""
def __init__(self, imagesPathLst=None, parent=None):
super(GalleryUi, self).__init__(parent)
self.__sw = QtGui.QDesktopWidget().screenGeometry(self).width()
self.__sh = QtGui.QDesktopWidget().screenGeometry(self).height()
self.__animRate = 1200
self._imagesPathLst = imagesPathLst
self._thumb_width = 200
self._thumb_height = self._thumb_width + 20
self.setUpWindow(initiate=True)
self._startControlBar()
self._connections()
def contextMenuEvent(self, event):
index = self.indexAt(event.pos())
menu = QtGui.QMenu()
renameAction = QtGui.QAction('Exit', self)
renameAction.triggered.connect(self.close)
self.menu.addAction(renameAction)
self.menu.popup(QtGui.QCursor.pos())
def closeEvent(self,event):
# in case gallery is launched by Slideshow this is not needed
if hasattr(self, 'bar'):
self.bar.close()
def _startControlBar(self):
if not self._slideShowWin:
self.bar = controlBar.ControlBar()
self.bar.show()
self.bar.exitBtn.clicked.connect(self.close)
self.bar.openBtn.clicked.connect(self.selectSetNewPath)
def _connections(self):
self.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
self.connect(self, QtCore.SIGNAL(self.customContextMenuRequested(QtCore.QPoint)), self, QtCore.SLOT(displayMenu(QtCore.QPoint)))
def displayMenu(self, pos):
self.menu = QtGui.QMenu()
self.menu.addAction(self.close)
self.menu.exec_(self.mapToGlobal(event.pos()))
def selectSetNewPath(self):
path = utils._browseDir("Select the directory that contains images")
self._imagesPathLst = utils.ingestData(path)
# sets model when new folder is choosen
self.updateModel()
def setUpWindow(self, initiate=False):
""" Method to setup window frameless and fullscreen,
setting up thumbnaul size and animation rate
"""
if not self._imagesPathLst:
self.selectSetNewPath()
# sets model once at startup when window is being drawn!
if initiate:
self.updateModel()
self.setGeometry(0, 0, self.__sw, self.__sh)
self.setColumnWidth(self._thumb_width, self._thumb_height)
self.setShowGrid(False)
self.setWordWrap(True)
self.show()
self.resizeColumnsToContents()
self.resizeRowsToContents()
self.selectionModel().selectionChanged.connect(self.selChanged)
def updateModel(self):
col = self.__sw/self._thumb_width
self._twoDLst = utils.convertToTwoDList(self._imagesPathLst, col)
lm = MyListModel(self._twoDLst, col,
(self._thumb_width, self._thumb_height), self)
self.setModel(lm)
def keyPressEvent(self, keyevent):
""" Capture key to exit, next image, previous image,
on Escape , Key Right and key left respectively.
"""
event = keyevent.key()
if event == QtCore.Qt.Key_Escape:
self._exitGallery()
def main(imgLst=None):
""" method to start gallery standalone
"""
app = QtGui.QApplication(sys.argv)
window = GalleryUi(imgLst)
window.raise_()
sys.exit(app.exec_())
if __name__ == '__main__':
current_path = os.getcwd()
if len(sys.argv) > 1:
current_path = sys.argv[1:]
main(utils.ingestData(current_path))
I finally implemented it this way!!
that works like a charm !!!
QTableView
hascontextMenuEvent()
event, to show a right-click menu:QMenu
inside this eventQAction
s toQMenu
QAction
to slots usingtriggered
signal ofQAction
popup(QCursor.pos())
onQMenu
When user right-click the tableView the cell under the mouse pointer will be selected and at the same time a menu will appear. When user selects an action on the menu, the connected slot will be called, get the selected cell of tabel in this slot and perform the required action on this cell.