【问题标题】:PyQt QTableWidget keyboard events while editingPyQt QTableWidget 编辑时的键盘事件
【发布时间】:2011-04-23 13:02:16
【问题描述】:

我想以类似于 MS Excel 的方式导航 QTableWidget

例如,当用户在编辑单元格时按下右箭头键,编辑将完成并选择右侧的下一个单元格。我已经搜索了 Qt 文档,但似乎无法找到方法。

【问题讨论】:

    标签: python qt pyqt pyside


    【解决方案1】:
    from PyQt4.QtCore import QEvent, Qt
    from PyQt4.QtGui import QTableWidget, QWidget, QVBoxLayout, QApplication
    
    
    class MyTableWidget(QTableWidget):
        def __init__(self):
            QTableWidget.__init__(self)
    
            self.keys = [Qt.Key_Left,
                         Qt.Key_Right]
    
            # We need this to allow navigating without editing
            self.catch = False 
    
        def focusInEvent(self, event):
            self.catch = False
            return QTableWidget.focusInEvent(self, event)
    
        def focusOutEvent(self, event):
            self.catch = True
            return QTableWidget.focusOutEvent(self, event)    
    
        def event(self, event):
            if self.catch and event.type() == QEvent.KeyRelease and event.key() in self.keys:
                self._moveCursor(event.key())
    
            return QTableWidget.event(self, event)
    
        def keyPressEvent(self, event):
            if not self.catch:
                return QTableWidget.keyPressEvent(self, event)
    
            self._moveCursor(event.key())
    
    
        def _moveCursor(self, key):
            row = self.currentRow()
            col = self.currentColumn()
    
            if key == Qt.Key_Left and col > 0:
                col -= 1
    
            elif key == Qt.Key_Right and col < self.columnCount():
                col += 1
    
            elif key == Qt.Key_Up and row > 0:
                row -= 1
    
            elif key == Qt.Key_Down and row < self.rowCount():
                row += 1
    
            else:
                return
    
            self.setCurrentCell(row, col)
            self.edit(self.currentIndex())
    
    
    class Widget(QWidget): 
        def __init__(self, parent=None): 
            QWidget.__init__(self)            
            tableWidget = MyTableWidget()
            tableWidget.setRowCount(10)
            tableWidget.setColumnCount(10)
    
            layout = QVBoxLayout() 
            layout.addWidget(tableWidget)  
            self.setLayout(layout) 
    
    app = QApplication([]) 
    widget = Widget() 
    widget.show() 
    app.exec_()
    

    不确定你是否还需要这个,但这里有。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-10
      • 2011-02-15
      • 2012-11-26
      • 2012-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-12
      相关资源
      最近更新 更多