当前位置: 首页 > article >正文

Qt自定义表格TableWidget实现整行单列按键逐行切换及跳转首尾

引言

  • 开发环境
  • 代码结构
  • 示例代码
  • 运行效果
  • 注意

项目开发中需要实现一个类似表格的界面,要求只能通过键盘操作界面,点击上下键,表格中逐行选中,但是每次只能选中整行中的第一列,点击向左按键则跳转到首行,点击向右的按键,跳转到最后一行,若是当先在视口显示的行后面还有看不到的行,在表格最左侧下方出现一个向下的图标,若是当前视口可见的首行之前还有其它的行,则表格左侧的上方出现一个向上的箭头,若是表格显示的行,不足以占满整个视口的行,则表格左侧上下箭头都不显示。左侧箭头的功能是提示当前页后面或者前面还有没有显示出来的行。
效果图如下:

Qt自定义TableWidget通过键盘上下左右键操作表格

开发环境

linux下QtCreator,其版本信息如下:
在这里插入图片描述

代码结构

在这里插入图片描述
界面的控件使用和布局如下:
在这里插入图片描述

示例代码

CommonData.h

#ifndef COMMONDATA_H
#define COMMONDATA_H

enum class PressKeyType{
   
    UP,
    DOWM,
    LEFT,//向前翻页至第一页
    RIGHT//向后翻页至最后一页
};

#endif // COMMONDATA_H

customtablewidget.h

#ifndef CUSTOMTABLEWIDGET_H
#define CUSTOMTABLEWIDGET_H

#include "CommonData.h"
#include <QTableWidget>


class CustomTableWidget : public QTableWidget
{
   
    Q_OBJECT
public:
    CustomTableWidget(QWidget *parent = nullptr);
protected:
    void keyPressEvent(QKeyEvent *event) override;
    void paintEvent(QPaintEvent *) override;
signals:
    void signUpdateClass(const int& index,const PressKeyType &pressType);
};

#endif // CUSTOMTABLEWIDGET_H

customtablewidget.cpp

#include "customtablewidget.h"

#include <QKeyEvent>
#include <QPainter>

CustomTableWidget::CustomTableWidget(QWidget *parent):QTableWidget(parent)
{
   

}

void CustomTableWidget::keyPressEvent(QKeyEvent *event)
{
   
    int nCurRow = currentRow();
    int nCurCol = currentColumn();
    if(event->key() == Qt::Key_Up){
   
        if(nCurRow != 0){
   
            currentItem()->setBackgroundColor(Qt::transparent);
            nCurRow -= 1;
            setCurrentCell(nCurRow,nCurCol);
            emit signUpdateClass(nCurRow,PressKeyType::UP);
        }
    }else if(event->key() == Qt::Key_Down){
   
        if(nCurRow != rowCount() -1){
   
            currentItem()->setBackgroundColor(Qt::transparent);
            nCurRow += 1;
            setCurrentCell(nCurRow,nCurCol);
            emit signUpdateClass(nCurRow,PressKeyType::DOWM);
        }
    }else if(event->key() == Qt::Key_Left){
   
        currentItem()->setBackgroundColor(Qt::transparent);
        setCurrentCell(0,0);
        emit signUpdateClass(0,PressKeyType::LEFT);
    }else if(event->key() == Qt::Key_Right){
   
        currentItem()->setBackgroundColor(Qt::transparent);
        setCurrentCell(rowCount()-1,0);
        emit signUpdateClass(rowCount()-1,PressKeyType::RIGHT);
    }else{
   
        QTableWidget::keyPressEvent(event);
    }
}

void CustomTableWidget::paintEvent(QPaintEvent *event)
{
   
    Q_UNUSED(event);

    //设置选中项的背景色
    QTableWidgetItem *newItem = this->currentItem();
    if (newItem) {
   
        newItem->setBackground(QBrush(Qt::blue));
    }

    QTableWidget::paintEvent(event);
}

dowmarrowlabel.h

#ifndef DOWNARROWLABEL_H
#define DOWNARROWLABEL_H

#include <QLabel>


class DownArrowLabel:public QLabel
{
   
public:
    DownArrowLabel(QWidget* parent = nullptr);
protected:
    void paintEvent(QPaintEvent *) override;
};

#endif // DOWNARROWLABEL_H

dowmarrowlabel.cpp

#include "downarrowlabel.h"

#include <QPainter>
#include <QtMath>//qSqrt()

DownArrowLabel::DownArrowLabel(QWidget *parent):QLabel(parent)
{
   
    setFixedSize(20,20);
}

void DownArrowLabel::paintEvent(QPaintEvent *event)
{
   
    QLabel::paintEvent(event); // 调用基类的paintEvent进行常规绘制(如果有的话)

    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing); // 抗锯齿

    // 设置画笔和画刷
    painter.setPen(Qt::NoPen); // 无边框
    painter.setBrush(Qt::yellow); // 黄色填充

    // 确定等边三角形的边长
    

http://www.kler.cn/a/406592.html

相关文章:

  • Spring Cloud Data Flow快速入门Demo
  • 内外网交换过程中可能遇到的安全风险有哪些?
  • shell编程(8) until循环以及函数基本创建调用
  • fastadmin实现站内通知功能
  • 深入了解 Linux htop 命令:功能、用法与示例
  • SAP PI/PO Proxy2JDBC SQL_QUERY动态接口示例
  • 【工控】线扫相机小结 第四篇
  • 2024内科学综合类科技核心期刊汇总
  • Pytorch使用手册-快速开始(专题一)
  • ArcGIS 10.2软件安装包下载及安装教程!
  • 美团面试:有哪些情况会产生死锁
  • Linux下Intel编译器oneAPI安装和链接MKL库编译
  • Android——连接MySQL(Java版)
  • 淘宝关键词订单API接口:电商运营的新利器
  • Python笔记2-六种标准数据类型3
  • android 使用MediaPlayer实现音乐播放--权限请求
  • PHP 高并发解决方案
  • Easyexcel(2-文件读取)
  • Elasticsearch 中的热点以及如何使用 AutoOps 解决它们
  • 【Lambda基础】Python Lambda 函数的 9 种玩法
  • 【1.2 Getting Started--->Installation Guide】
  • Cmakelist.txt之Linux-redis配置
  • Java、Android引用类型
  • rust中解决DPI-1047: Cannot locate a 64-bit Oracle Client library问题
  • C++ String
  • 【嵌入式】手把手教你入门STM32的GPIO:使用GPIO输入