在使用 keyPressEvent 子类化 QTableView 后,我失去了对箭头键的使用。如何在保持自定义信号的同时轻松使用它们进行导航?

Posted

技术标签:

【中文标题】在使用 keyPressEvent 子类化 QTableView 后,我失去了对箭头键的使用。如何在保持自定义信号的同时轻松使用它们进行导航?【英文标题】:After subclassing QTableView an using keyPressEvent ive lost use of arrow keys. How can I easily use them to navigate while keeping the custom signal? 【发布时间】:2017-04-07 13:12:02 【问题描述】:

正如标题所说,在继承 QTableView 以便能够使用 return/enter 键从视图中选择行之后,我失去了使用向上和向下箭头导航视图的能力。我可以使用子类中的键(当我按下向上或向下箭头时我可以打印),但是在使所选行随它们上下移动时遇到问题。为 up 和 down 创建自定义信号并将它们与自己的函数连接以强制移动所选行是我的最佳选择吗?

这是我的子类:

class CustomQTableView(QtWidgets.QTableView):    
    signal = QtCore.pyqtSignal()

    def __init__(self, *args, **kwargs):
        QtWidgets.QTableView.__init__(self, *args, **kwargs)

    def keyPressEvent(self, event):

        if event.key() == QtCore.Qt.Key_Return:
            self.signal.emit()
        elif event.key() == QtCore.Qt.Key_Up:
            print("Up")
        elif event.key() == QtCore.Qt.Key_Down:
            print("Down")
        else:
            pass

【问题讨论】:

【参考方案1】:

以防万一有人偶然发现

class CustomQTableView(QtWidgets.QTableView):    
signal = QtCore.pyqtSignal()

def __init__(self, *args, **kwargs):
    QtWidgets.QTableView.__init__(self, *args, **kwargs)

def keyPressEvent(self, event):

    if event.key() == QtCore.Qt.Key_Return:
        self.signal.emit()
    else:
        QtWidgets.QTableView.keyPressEvent(self, event)

【讨论】:

看起来更好,但我不能再在我的代码中测试它了【参考方案2】:

这很好地解决了它的问题。我会在这里添加代码以防其他人遇到同样的问题

自定义小部件(QTableView)

class CustomQTableView(QtWidgets.QTableView):    
    signal = QtCore.pyqtSignal()
    signal_up = QtCore.pyqtSignal()
    signal_down = QtCore.pyqtSignal()
    def __init__(self, *args, **kwargs):
        QtWidgets.QTableView.__init__(self, *args, **kwargs)
        self.setSelectionMode(QtWidgets.QAbstractItemView.SingleSelection)
        self.ScrollHint(QtWidgets.QAbstractItemView.EnsureVisible)


    def keyPressEvent(self, event):         
        if event.key() == QtCore.Qt.Key_Return:
            self.signal.emit()
        elif event.key() == QtCore.Qt.Key_Up:
            self.signal_up.emit()
        elif event.key() == QtCore.Qt.Key_Down:
            self.signal_down.emit()
        else:
            pass

我使用箭头键移动所选行的功能:

def arrowkey(self,num):
    try:
        selection_model = self.ui.vt_Produkt_Treff.selectionModel()
        indexes = selection_model.selectedIndexes()
        muh = indexes[0].row()
        self.ui.vt_Produkt_Treff.clearSelection()
        self.ui.vt_Produkt_Treff.selectRow(muh+ num)
    except UnboundLocalError:
        pass

【讨论】:

以上是关于在使用 keyPressEvent 子类化 QTableView 后,我失去了对箭头键的使用。如何在保持自定义信号的同时轻松使用它们进行导航?的主要内容,如果未能解决你的问题,请参考以下文章

PyQt / PySide keyPressEvent 默认行为

是否需要在子类中调用基类的事件处理函数?

Qt 中响应回车事件 keyPressEvent

Qt如何重写虚函数

不能通过 keyPressEvent 使用 QPlainTextEdit 中的其他键

QMainWindow 没有收到 keyPressEvent,即使有事件过滤器