如何通过 PyQt5 中的按钮单击将项目设置为正在编辑
How to set an item to being edited from a button click in PyQt5
我正在尝试在我一直在使用的 GUI 中创建一个 "Rename" 按钮。单击此按钮后,我希望所选项目进入 "Edit mode",您可以在其中键入新名称。
我已经到了一切正常的地步,但我不知道如何正确设置标志以便从索引进入编辑模式。下面是一个独立的工作示例。
在这个例子中,如果我选择了我要编辑的项目,然后按F2,它就会进入编辑模式。我想在单击 "Rename" 按钮时实现相同的目的。
class MainWindow(QMainWindow):
def __init__(self, app):
super().__init__()
self.main_widget = QWidget()
self.tree = DataBrowserTree()
self.setCentralWidget(self.tree)
self.resize(QSize(1340, 1080))
self.show()
class DataBrowserTree(QTreeView):
def __init__(self):
super(DataBrowserTree, self).__init__()
datafiles_path = r'C:\Repositories\QDscript\DotGUI\TestProjects\Proj_3\datafiles'
self.model = QFileSystemModel()
self.model.setRootPath(datafiles_path)
self.model.setReadOnly(False)
index = self.model.index(datafiles_path)
self.setObjectName('dataBrowserTree')
self.setModel(self.model)
self.setRootIndex(index)
self.setAnimated(False)
self.setIndentation(20)
self.setSortingEnabled(True)
self.sortByColumn(0, Qt.AscendingOrder)
self.setHeaderHidden(True)
self.setSortingEnabled(False)
self.setColumnHidden(1, True)
self.setColumnHidden(2, True)
self.setColumnHidden(3, True)
self.setWindowTitle("Dir View")
def mouseReleaseEvent(self, QMouseEvent):
if QMouseEvent.button() == 2:
self.show_rightclick_menu(QMouseEvent.globalPos())
def show_rightclick_menu(self, pos):
self.rightclick_menu = QMenu()
self.action_rename = QAction(self)
self.action_rename.setText('Rename')
self.action_rename.triggered.connect(lambda: self.clicked('rename'))
self.rightclick_menu.addAction(self.action_rename)
self.rightclick_menu.move(pos.x(), pos.y())
self.rightclick_menu.show()
def clicked(self, click_str):
if click_str == 'rename':
index = self.selectedIndexes()[0] # This gets the correct QModelIndex
print(index) # <PyQt5.QtCore.QModelIndex object at 0x1823D930>
def edit(self, index, trigger, event):
# When F2 is pressed I get:
# index --> QModelIndex object
# trigger --> 8 (the key code)
# event --> QKeyEvent object
return QTreeView.edit(self, index, trigger, event)
if __name__ == '__main__':
app = QApplication(sys.argv)
mw = MainWindow(app)
sys.exit(app.exec_())
您不必重写 edit()
方法,而是使用它。另一方面,在将 contextMenuPolicy
设置为 Qt::CustomContextMenu
时,应使用 customContextMenuRequested
信号而不是覆盖覆盖默认行为的 mouseReleaseEvent
方法,如下所示:
class DataBrowserTree(QTreeView):
def __init__(self):
super(DataBrowserTree, self).__init__()
datafiles_path = r'C:\Repositories\QDscript\DotGUI\TestProjects\Proj_3\datafiles'
self.model = QFileSystemModel()
self.model.setRootPath(datafiles_path)
self.model.setReadOnly(False)
index = self.model.index(datafiles_path)
self.setObjectName("dataBrowserTree")
self.setModel(self.model)
self.setRootIndex(index)
self.setAnimated(False)
self.setIndentation(20)
self.setSortingEnabled(True)
self.sortByColumn(0, Qt.AscendingOrder)
self.setHeaderHidden(True)
self.setSortingEnabled(False)
for i in (1, 2, 3):
self.setColumnHidden(i, True)
self.setWindowTitle("Dir View")
self.setContextMenuPolicy(Qt.CustomContextMenu)
self.customContextMenuRequested.connect(self.show_rightclick_menu)
def show_rightclick_menu(self, pos):
ix = self.indexAt(pos)
rightclick_menu = QMenu()
action_rename = QAction(self)
action_rename.setText("Rename")
rightclick_menu.addAction(action_rename)
action = rightclick_menu.exec_(self.viewport().mapToGlobal(pos))
if action == action_rename:
self.edit(ix)
我正在尝试在我一直在使用的 GUI 中创建一个 "Rename" 按钮。单击此按钮后,我希望所选项目进入 "Edit mode",您可以在其中键入新名称。
我已经到了一切正常的地步,但我不知道如何正确设置标志以便从索引进入编辑模式。下面是一个独立的工作示例。
在这个例子中,如果我选择了我要编辑的项目,然后按F2,它就会进入编辑模式。我想在单击 "Rename" 按钮时实现相同的目的。
class MainWindow(QMainWindow):
def __init__(self, app):
super().__init__()
self.main_widget = QWidget()
self.tree = DataBrowserTree()
self.setCentralWidget(self.tree)
self.resize(QSize(1340, 1080))
self.show()
class DataBrowserTree(QTreeView):
def __init__(self):
super(DataBrowserTree, self).__init__()
datafiles_path = r'C:\Repositories\QDscript\DotGUI\TestProjects\Proj_3\datafiles'
self.model = QFileSystemModel()
self.model.setRootPath(datafiles_path)
self.model.setReadOnly(False)
index = self.model.index(datafiles_path)
self.setObjectName('dataBrowserTree')
self.setModel(self.model)
self.setRootIndex(index)
self.setAnimated(False)
self.setIndentation(20)
self.setSortingEnabled(True)
self.sortByColumn(0, Qt.AscendingOrder)
self.setHeaderHidden(True)
self.setSortingEnabled(False)
self.setColumnHidden(1, True)
self.setColumnHidden(2, True)
self.setColumnHidden(3, True)
self.setWindowTitle("Dir View")
def mouseReleaseEvent(self, QMouseEvent):
if QMouseEvent.button() == 2:
self.show_rightclick_menu(QMouseEvent.globalPos())
def show_rightclick_menu(self, pos):
self.rightclick_menu = QMenu()
self.action_rename = QAction(self)
self.action_rename.setText('Rename')
self.action_rename.triggered.connect(lambda: self.clicked('rename'))
self.rightclick_menu.addAction(self.action_rename)
self.rightclick_menu.move(pos.x(), pos.y())
self.rightclick_menu.show()
def clicked(self, click_str):
if click_str == 'rename':
index = self.selectedIndexes()[0] # This gets the correct QModelIndex
print(index) # <PyQt5.QtCore.QModelIndex object at 0x1823D930>
def edit(self, index, trigger, event):
# When F2 is pressed I get:
# index --> QModelIndex object
# trigger --> 8 (the key code)
# event --> QKeyEvent object
return QTreeView.edit(self, index, trigger, event)
if __name__ == '__main__':
app = QApplication(sys.argv)
mw = MainWindow(app)
sys.exit(app.exec_())
您不必重写 edit()
方法,而是使用它。另一方面,在将 contextMenuPolicy
设置为 Qt::CustomContextMenu
时,应使用 customContextMenuRequested
信号而不是覆盖覆盖默认行为的 mouseReleaseEvent
方法,如下所示:
class DataBrowserTree(QTreeView):
def __init__(self):
super(DataBrowserTree, self).__init__()
datafiles_path = r'C:\Repositories\QDscript\DotGUI\TestProjects\Proj_3\datafiles'
self.model = QFileSystemModel()
self.model.setRootPath(datafiles_path)
self.model.setReadOnly(False)
index = self.model.index(datafiles_path)
self.setObjectName("dataBrowserTree")
self.setModel(self.model)
self.setRootIndex(index)
self.setAnimated(False)
self.setIndentation(20)
self.setSortingEnabled(True)
self.sortByColumn(0, Qt.AscendingOrder)
self.setHeaderHidden(True)
self.setSortingEnabled(False)
for i in (1, 2, 3):
self.setColumnHidden(i, True)
self.setWindowTitle("Dir View")
self.setContextMenuPolicy(Qt.CustomContextMenu)
self.customContextMenuRequested.connect(self.show_rightclick_menu)
def show_rightclick_menu(self, pos):
ix = self.indexAt(pos)
rightclick_menu = QMenu()
action_rename = QAction(self)
action_rename.setText("Rename")
rightclick_menu.addAction(action_rename)
action = rightclick_menu.exec_(self.viewport().mapToGlobal(pos))
if action == action_rename:
self.edit(ix)