QTableView的setCurrentIndex将currentIndex放置在错误的位置

Eurydice

QTableView在上面覆盖了该keyPressEvent方法,例如,当用户按下tab右下角键时,会将新行添加到基础(熊猫)模型。完成此操作后,我希望当前索引位于新的右下角。这是一个原则上应完成此工作的示例:

from PyQt5 import QtCore, QtWidgets

class DL50TableView(QtWidgets.QTableView):

    def keyPressEvent(self, event):

        key = event.key()

        model = self.model()

        current_index = self.currentIndex()
        row = current_index.row()
        column = current_index.column()

        if key == QtCore.Qt.Key_Tab:
            if column == model.columnCount() - 1 and row == model.rowCount() - 1:
                model.insertRows(model.rowCount())
                index = model.index(model.rowCount() - 1,model.columnCount() - 1)
                self.setCurrentIndex(index)

        elif key == QtCore.Qt.Key_Backspace:
            if column == 0 and row == model.rowCount() - 1:
                model.removeRows(model.rowCount() - 1)
                index = model.index(model.rowCount() - 1,0)
                self.setCurrentIndex(index)

        super(DL50TableView, self).keyPressEvent(event)  

import pandas as pd

from PyQt5 import QtCore, QtGui

class DL50Model(QtCore.QAbstractTableModel):

    def __init__(self, *args, **kwargs):

        super(DL50Model,self).__init__(*args, **kwargs)        

        self._data = pd.DataFrame([self.default_line()], columns=['include',
                                                                  'dose',
                                                                  'response',
                                                                  'nominal',
                                                                  'log10(dose)',
                                                                  'contrib.\ndae',
                                                                  'prob.\nof\nresponse',
                                                                  'likelihood\ncontrib.',
                                                                  'prob.\nof\nresponse\n(sub)',
                                                                  'likelihood\ncontrib.\n(sub)',
                                                                  'prob.\nof\nresponse\n(over)',
                                                                  'likelihood\ncontrib.\n(over)'])

    def columnCount(self, parent=None):
        return len(self._data.columns)

    def data(self, index, role):

        if not index.isValid():
            return False

        row = index.row()
        col = index.column()
        if role == QtCore.Qt.BackgroundRole and col >= 3:
            return QtGui.QBrush(QtCore.Qt.gray)
        elif role == QtCore.Qt.CheckStateRole and col in [0,2,3]:
            return self._data.iloc[row][col]
        elif role == QtCore.Qt.DisplayRole:
            if col in [0,2,3]:
                return None
            return str(self._data.iloc[row][col])
        return None

    def default_line(self):
        return [False, 0.0,False, False, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
    
    def insertRows(self, position, rows=1, index=QtCore.QModelIndex()):
        """Insert row(s) into the model.
        
        Args:
            position (int): the position of the row(s) to iunsert
            rows (int): the number of rows to insert
            index (QModelIndex): the parent index
        """
        
        self.beginInsertRows(QtCore.QModelIndex(), position, position + rows - 1)

        default = [self.default_line()]*rows
        lines = pd.DataFrame(default, columns=self._data.columns)
        self._data = pd.concat([self._data.iloc[:position], lines, self._data.iloc[position:]]).reset_index(drop=True)

        self.endInsertRows()

        return True

    def removeRows(self, position, rows=1, parent=QtCore.QModelIndex()):
        """Remove row(s) from the model.

        Args:
            position (int): the position of the row(s) to delete
            rows (int): the number of rows to delete
            index (QModelIndex): the parent index
        """

        self.beginRemoveRows(QtCore.QModelIndex(), position, position + rows - 1)

        print('BEFORE', len(self._data.index))
        self._data.drop(self._data.index[position:position+rows], inplace=True)
        print('AFTER', len(self._data.index))

        self.endRemoveRows()

        return True

    def rowCount(self, parent=None):
        return len(self._data.index)

运行该代码时,当我按tab键时实际上会添加新行,但是该行currentIndex设置为,(0,0)而不是我编写的代码所期望的右下角。您知道我的视图/模型出了什么问题吗?

永乐

通过重写keyPressEvent方法,因为在实现自定义逻辑之后,您将调用选项卡用于移动currentIndex的默认代码,并且由于currentIndex在bottonRight中,因此它将移至topLeft。

一种可能的解决方案是使用“ return”语句阻止默认行为的运行:

# ...
if key == QtCore.Qt.Key_Tab:
    if column == model.columnCount() - 1 and row == model.rowCount() - 1:
        model.insertRows(model.rowCount())
        index = model.index(model.rowCount() - 1, model.columnCount() - 1)
        self.setCurrentIndex(index)
        return
# ...

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Google地球将地标放置在错误的位置

来自分类Dev

直接标签将标签放置在错误的位置

来自分类Dev

</ script>标记放置在错误的位置

来自分类Dev

Dropbox图标放置在错误的位置

来自分类Dev

Google Maps标记放置在错误的位置

来自分类Dev

将JavaFX Button放置在特定位置

来自分类Dev

如何将正确的位置css放置?

来自分类Dev

在UL内将文本放置在与a分开的位置:

来自分类Dev

是否将Mac桌面放置在适当的位置?

来自分类Dev

将JTextArea放置在特定位置

来自分类Dev

WPF 将容器放置在固定位置

来自分类Dev

将object3d放置在海拔位置目标位置

来自分类Dev

TFS2013:将诊断活动日志复制到放置位置时发生错误。详细信息:内部服务器错误

来自分类Dev

TFS2013:将诊断活动日志复制到放置位置时发生错误。详细信息:内部服务器错误

来自分类Dev

python_stubs目录放置在错误的位置(PyCharm 3.4)

来自分类Dev

Ruby on Rails:哈希无法正常工作或放置在错误的位置

来自分类Dev

将div放置在另一个div的位置

来自分类Dev

将气球放置在“画布”内单击的任何位置

来自分类Dev

将数据集文件放置在gnuplot中的位置

来自分类Dev

将链接放置在div的中间(水平/垂直)位置

来自分类Dev

将多个图像放置在同一位置

来自分类Dev

如何将游戏对象放置到鼠标位置

来自分类Dev

将滑动div放置在固定的底部位置

来自分类Dev

如何将标签放置在饼图中的更远位置

来自分类Dev

如何将传单缩放控件放置在所需位置

来自分类Dev

将图像放置在Xamarin表单应用程序的位置

来自分类Dev

将组件放置在我的next.js文件中的位置

来自分类Dev

将div放置在页面上的任意位置,但仍将文本环绕

来自分类Dev

将Rails Form_For字段放置在不同的位置

Related 相关文章

  1. 1

    Google地球将地标放置在错误的位置

  2. 2

    直接标签将标签放置在错误的位置

  3. 3

    </ script>标记放置在错误的位置

  4. 4

    Dropbox图标放置在错误的位置

  5. 5

    Google Maps标记放置在错误的位置

  6. 6

    将JavaFX Button放置在特定位置

  7. 7

    如何将正确的位置css放置?

  8. 8

    在UL内将文本放置在与a分开的位置:

  9. 9

    是否将Mac桌面放置在适当的位置?

  10. 10

    将JTextArea放置在特定位置

  11. 11

    WPF 将容器放置在固定位置

  12. 12

    将object3d放置在海拔位置目标位置

  13. 13

    TFS2013:将诊断活动日志复制到放置位置时发生错误。详细信息:内部服务器错误

  14. 14

    TFS2013:将诊断活动日志复制到放置位置时发生错误。详细信息:内部服务器错误

  15. 15

    python_stubs目录放置在错误的位置(PyCharm 3.4)

  16. 16

    Ruby on Rails:哈希无法正常工作或放置在错误的位置

  17. 17

    将div放置在另一个div的位置

  18. 18

    将气球放置在“画布”内单击的任何位置

  19. 19

    将数据集文件放置在gnuplot中的位置

  20. 20

    将链接放置在div的中间(水平/垂直)位置

  21. 21

    将多个图像放置在同一位置

  22. 22

    如何将游戏对象放置到鼠标位置

  23. 23

    将滑动div放置在固定的底部位置

  24. 24

    如何将标签放置在饼图中的更远位置

  25. 25

    如何将传单缩放控件放置在所需位置

  26. 26

    将图像放置在Xamarin表单应用程序的位置

  27. 27

    将组件放置在我的next.js文件中的位置

  28. 28

    将div放置在页面上的任意位置,但仍将文本环绕

  29. 29

    将Rails Form_For字段放置在不同的位置

热门标签

归档