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); // 黄色填充
// 确定等边三角形的边长