From 12dc6fc9f3695b7094ae9e47c4603be9f47d1181 Mon Sep 17 00:00:00 2001 From: thomahl <thomahl@stud.ntnu.no> Date: Fri, 6 Mar 2020 12:47:44 +0100 Subject: [PATCH] =?UTF-8?q?#32=20shortcuts=20fungerer=20n=C3=A5=20ved=20fl?= =?UTF-8?q?ere=20TableModules=20i=20samme=20scene?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Å legge til noen rader, for så å fjerne noen rader fungerer ikke, men dette er trolig ikke et problem med keyPressEvent Under følger en snippet som viser hva som ikke fungerte før: ```python from PySide2.QtWidgets import QVBoxLayout, QApplication, QWidget, QGraphicsScene, QGraphicsView, QTableWidget, QShortcut, QHBoxLayout from PySide2.QtGui import QKeySequence from PySide2.QtCore import Qt class QTableWidthWithShortcuts(QTableWidget): def __init__(self, *args, **kwargs): super(QTableWidthWithShortcuts, self).__init__(*args, **kwargs) shortcut = QShortcut(QKeySequence("Shift++"), self, context=Qt.WidgetWithChildrenShortcut) shortcut.activated.connect(self.say_hello) def say_hello(self): print("Hello") app = QApplication() # inside QGrahpicsScene # shortcuts don't work.. scene = QGraphicsScene() view = QGraphicsView(scene) t1 = QTableWidthWithShortcuts(2,2) t1.move(0,0) scene.addWidget(t1) t2 = QTableWidthWithShortcuts(2,2) t2.move(300,0) scene.addWidget(t2) view.show() # inside QHBoxLayout # shortcuts work!! layout = QHBoxLayout() t1 = QTableWidthWithShortcuts(2,2) layout.addWidget(t1) t2 = QTableWidthWithShortcuts(2,2) layout.addWidget(t2) wrapper_widget = QWidget() wrapper_widget.setLayout(layout) wrapper_widget.show() app.exec_() ``` Her er en snippet som viser hvordan denne løsningen unngår problemet over: ```python from PySide2.QtWidgets import QVBoxLayout, QApplication, QWidget, QGraphicsScene, QGraphicsView, QTableWidget, QShortcut, QHBoxLayout from PySide2.QtGui import QKeySequence from PySide2.QtCore import Qt class QTableWidthWithShortcuts(QTableWidget): def __init__(self, uid, *args, **kwargs): super(QTableWidthWithShortcuts, self).__init__(*args, **kwargs) self.uid = uid def keyPressEvent(self, event): if event.key() == Qt.Key_Question: print("{}: Shift and plus!".format(self.uid)) elif event.modifiers() == Qt.ShiftModifier and event.key() == Qt.Key_Underscore: print("{}: Shift and minus!".format(self.uid)) elif event.modifiers() == Qt.ControlModifier and event.key() == Qt.Key_Plus: print("{}: Ctrl and plus!".format(self.uid)) elif event.modifiers() == Qt.ControlModifier and event.key() == Qt.Key_Underscore: print("{}: Ctrl and minus!".format(self.uid)) else: super(QTableWidthWithShortcuts, self).keyPressEvent(event) app = QApplication() scene = QGraphicsScene() view = QGraphicsView(scene) t1 = QTableWidthWithShortcuts("A", 2,2) t1.move(0,0) scene.addWidget(t1) t2 = QTableWidthWithShortcuts("B", 2,2) t2.move(300,0) scene.addWidget(t2) view.show() app.exec_() ``` --- soitool/modules/module_table.py | 40 ++++++++++++++++++++------------- 1 file changed, 25 insertions(+), 15 deletions(-) diff --git a/soitool/modules/module_table.py b/soitool/modules/module_table.py index e9d06a7..e4c3b98 100644 --- a/soitool/modules/module_table.py +++ b/soitool/modules/module_table.py @@ -58,7 +58,31 @@ class TableModule(ModuleBase, QTableWidget, metaclass=Meta): self.cellChanged.connect(self.resize) - self.set_shortcuts() + def keyPressEvent(self, event): + """Launch actions when specific combinations of keys are pressed. + + If the keys pressed are not related to a shortcut on this custom widget + the event is sent on to be handled by the superclass (for navigation + with arrow-keys for.eg.) + + The combinations used below work on Thomas' machine, but are not + guaranteed to work on all machines. This needs to be checked. + + Paramters + --------- + event : QKeyEvent + event sent by Qt for us to handle + """ + if event.key() == QtCore.Qt.Key_Question: + self.add_column() + elif event.modifiers() == QtCore.Qt.ShiftModifier and event.key() == QtCore.Qt.Key_Underscore: + self.remove_column() + elif event.modifiers() == QtCore.Qt.ControlModifier and event.key() == QtCore.Qt.Key_Plus: + self.add_row() + elif event.modifiers() == QtCore.Qt.ControlModifier and event.key() == QtCore.Qt.Key_Underscore: + self.remove_row() + else: + super(TableModule, self).keyPressEvent(event) def set_header_item(self, column, text): """Insert item with header-style. @@ -77,20 +101,6 @@ class TableModule(ModuleBase, QTableWidget, metaclass=Meta): item.setFont(HEADER_FONT) self.setItem(0, column, item) - def set_shortcuts(self): - """Set shortcuts for adding and removing rows and columns.""" - # Create shortcuts - shortcut_add_col = QShortcut(QtGui.QKeySequence("Shift++"), self) - shortcut_rem_col = QShortcut(QtGui.QKeySequence("Shift+-"), self) - shortcut_add_row = QShortcut(QtGui.QKeySequence("Ctrl++"), self) - shortcut_rem_row = QShortcut(QtGui.QKeySequence("Ctrl+-"), self) - - # Connect shortcuts to functions - shortcut_add_col.activated.connect(self.add_column) - shortcut_rem_col.activated.connect(self.remove_column) - shortcut_add_row.activated.connect(self.add_row) - shortcut_rem_row.activated.connect(self.remove_row) - def add_column(self): """Add column to the right of selected column.""" self.insertColumn(self.currentColumn() + 1) -- GitLab