QTableWidget重载实现键盘操作

36 篇文章 9 订阅

功能介绍

原文:http://beself.top/2020/02/15/qtablewidget-overrode-keypressevent/

  1. Tab间单元格向后走一格,最后一格时新建一行并移动到新建行的第一格
  2. 上键移动到第一行时不再移动,移动到最后一行时新建一行并移动到新建行
  3. 左键移动第一行第一列时停止移动,否则一直向前移动
  4. 右键移动到最后一行最后一列时新新建一行并移动到新行,否则向后移动
  5. 下键移动到最后一行时新建行并向下移动

动图展示

在这里插入图片描述

部分代码


void JTableView::keyPressEvent(QKeyEvent* e)
{
    int ColCnt = columnCount();
    int RowCnt = rowCount();
    switch (e->key()) {
    case Qt::Key_Tab:
    {
        ++curColumn;
        if(ColCnt == curColumn) {
            curColumn = 0;
            ++curRow;
            setRowCount(RowCnt + 1);
            setCurrentCell(curRow, 0);
        }
        else {
            setCurrentCell(curRow, curColumn);
        }
    }
        break;
    case Qt::Key_Up:
    {
        if(0 == curRow)
            break;
        --curRow;
        setCurrentCell(curRow, curColumn);
    }
        break;
    case Qt::Key_Down:
    {
        ++curRow;
        if(RowCnt == curRow) {
            setRowCount(RowCnt + 1);
            setCurrentCell(curRow, curColumn);
        }
        else {
            setCurrentCell(curRow, curColumn);
        }
    }
        break;
    case Qt::Key_Left:
    {
        if(0 == curRow && 0 == curColumn)
            break;
        else if (curRow > 0 && curColumn == 0) {
            --curRow;
            curColumn = ColCnt - 1;
            setCurrentCell(curRow, curColumn);
        }
        else {
            --curColumn;
            setCurrentCell(curRow, curColumn);
        }
    }
        break;
    case Qt::Key_Right:
    {
        ++curColumn;
        if(RowCnt - 1 == curRow) {
            if(ColCnt == curColumn) {
                setRowCount(RowCnt + 1);
                curColumn = 0;
                ++curRow;
            }
        }
        else {
            if(ColCnt == curColumn) {
                ++curRow;
                curColumn = 0;
            }
        }
        setCurrentCell(curRow, curColumn);
    }
        break;
    default:
        break;
    }
}

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
可以按照以下步骤将Excel数据导入到QTableWidget中: 1. 安装 `pandas` 和 `openpyxl` 库,用于读取和解析 Excel 文件。 ```python pip install pandas openpyxl ``` 2. 在代码中引入 `pandas` 库和 `QTableWidget` 控件。 ```python import pandas as pd from PyQt5.QtWidgets import QTableWidget, QTableWidgetItem ``` 3. 使用 `pandas` 的 `read_excel` 函数读取 Excel 文件数据,并将其转换为 `DataFrame` 对象。 ```python df = pd.read_excel('data.xlsx') ``` 4. 获取 `DataFrame` 对象的行数和列数,并设置 `QTableWidget` 控件的行数和列数。 ```python num_rows, num_cols = df.shape table = QTableWidget(num_rows, num_cols) ``` 5. 使用 `for` 循环遍历 `DataFrame` 对象的每一行和每一列,并将数据添加到 `QTableWidget` 控件中。 ```python for i in range(num_rows): for j in range(num_cols): item = QTableWidgetItem(str(df.iloc[i, j])) table.setItem(i, j, item) ``` 6. 将 `QTableWidget` 控件添加到窗口中显示。 ```python layout.addWidget(table) ``` 完整代码示例: ```python import pandas as pd from PyQt5.QtWidgets import QWidget, QTableWidget, QTableWidgetItem, QVBoxLayout class MyWidget(QWidget): def __init__(self): super().__init__() # 读取 Excel 文件数据 df = pd.read_excel('data.xlsx') # 获取行数和列数 num_rows, num_cols = df.shape # 创建 QTableWidget 控件 table = QTableWidget(num_rows, num_cols) # 遍历 DataFrame 对象,并将数据添加到 QTableWidget 控件中 for i in range(num_rows): for j in range(num_cols): item = QTableWidgetItem(str(df.iloc[i, j])) table.setItem(i, j, item) # 将 QTableWidget 控件添加到窗口中显示 layout = QVBoxLayout(self) layout.addWidget(table) if __name__ == '__main__': import sys from PyQt5.QtWidgets import QApplication app = QApplication(sys.argv) widget = MyWidget() widget.show() sys.exit(app.exec_()) ``` 注意:以上代码在读取 Excel 文件时,使用的是默认的第一个工作表数据。如果需要读取其他工作表数据,需要在 `read_excel` 函数中指定 `sheet_name` 参数。例如:`df = pd.read_excel('data.xlsx', sheet_name='Sheet2')`,表示读取 `data.xlsx` 文件中的 `Sheet2` 工作表数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ALONE_WORK

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值