python - 子类化小部件以覆盖方法,同时保留原始方法功能
问题描述
我想使用CTRL+C从 QTableWidget 复制数据。为此,我对 QTableWidget 进行了子类化并覆盖了 keyPressEvent() 方法,该方法效果很好。但是,这会丢失有用的 keyPressEvent() 功能,例如使用方向键滚动表格。
有没有办法让原始方法固有地实现一些额外的功能?
class SubQTableWidget(QtWidgets.QTableWidget):
def __init__(self, parent=None):
QtWidgets.QTableWidget.__init__(self, parent)
def keyPressEvent(self, event):
# inheret original keyPressEvent() functionality?
if (event.type() == QtCore.QEvent.KeyPress and
event.matches(QtGui.QKeySequence.Copy)):
self.copy_selection()
解决方案
要覆盖一个方法,您必须了解它是否与新功能冲突。CTRL在这种情况下,QTableWidget 的 keyPressEvent 方法与+快捷方式不冲突,C因为默认情况下它们对该键不执行任何操作,因此为避免丢失以前的功能,您必须调用父级的 super 方法:
def keyPressEvent(self, event):
super(SubQTableWidget, self).keyPressEvent(event)
if event.matches(QtGui.QKeySequence.Copy)):
self.copy_selection()
如果您想以简单的方式处理CTRL+ C,则可以使用 QShortcut ,因此无需覆盖 keyPressEvent 方法:
class SubQTableWidget(QtWidgets.QTableWidget):
def __init__(self, parent=None):
super(SubQTableWidget, self).__init__(parent)
QtWidgets.QShortcut(
QtGui.QKeySequence(QtGui.QKeySequence.Copy),
self,
activated=self.copy_selection,
context=QtCore.Qt.WidgetShortcut
)
推荐阅读
- xml - 如何将xml包导入databricks
- javascript - 如何使用变量设置 Ajax Url
- javascript - jsGrid过滤问题从.net控制器调用数据
- react-native - 在 AppState 更改时将 DateTime 值存储在 AsyncStorage 中
- java - SSLHandshakeException:收到致命警报:access_denied
- javascript - 如何将逗号分隔的字符串值转换为数字?
- c++ - 不透明结构与具有私有成员的类
- reactjs - 在 ReactJS 中使用 props 有条件地渲染一个 div
- python - 如何使用 Python 客户端正确验证 Kusto?
- r - 如何使用 tmap 在 R 中手动设置点的颜色