1 QTableView 基本使用
两者主要区别是QTableView可以使用自定义的数据模型来显示内容(也就意味着使用时先要通过setModel来绑定数据源),而QTableWidget则只能使用标准的数据模型。
理论上来讲,用QTableView实现的功能,在QTableWidget中也能达到同样的效果,因为QTableWidget它是继承自[public] QTableView,接口都是通用的。
QTableWidget封装了非常完善的事件反应接口,但本质是同QTableView一致,只不过QTableWidget生产了一些扩展的代码。
————————————————
以上文字原文链接:https://blog.csdn.net/weixin_45745398/article/details/129119999
1.1 代码
QStandardItemModel *model = new QStandardItemModel(); //创建一个Item模型
QString line = QString("q,w,e,r,t,y,,u,i,o,p");
QStringList list = line.simplified().split(',');
model->setHorizontalHeaderLabels(list); //在Item模型的水平方向添加标签
line = QString("a,s,c,d,e");
list = line.simplified().split(',');
model->setVerticalHeaderLabels(list);//在Item模型的垂直方向添加标签
int row = 0;
QStandardItem *newItem = 0; //添加一个内容模板
line = QString("12,2,3,4,5");
if (!line.startsWith('#') && line.contains(',')) {
list = line.simplified().split(',');
for (int col = 0; col < list.length(); ++col) {
newItem = new QStandardItem(list.at(col));
model->setItem(row, col, newItem);//在Item模型添加内容
}
++row;
}
ui.frozenTableView->setModel(model); //将模板设置到TableView
效果如图
2 TableWidget 基本使用
2.1 代码
QStringList header;
header << "name" << "age";
ui.tableWidget->setHorizontalHeaderLabels(header);
header.clear();
header << "a" << "b";
ui.tableWidget->setVerticalHeaderLabels(header);
//ui.tableWidget->setItem(0, 0, new QTableWidgetItem("Jan"));
//ui.tableWidget->setItem(1, 0, new QTableWidgetItem("Feb"));
QTableWidgetItem* name0 = new QTableWidgetItem; //创建Widget项目
QTableWidgetItem* name1 = new QTableWidgetItem;
QTableWidgetItem* age0 = new QTableWidgetItem;
QTableWidgetItem* age1 = new QTableWidgetItem;
name0->setText("张三");
name1->setText("李四");
age0->setText("28");
age1->setText("26");
name1->setBackgroundColor(QColor(10,100,10));//设置颜色
//为指定的某行或某列设置item
ui.tableWidget->setItem(0, 0, name0); //设置项目
ui.tableWidget->setItem(1, 0, name1);
ui.tableWidget->setItem(0, 1, age0);
ui.tableWidget->setItem(1, 1, age1);
效果图片:
3 重写QTableView
3.1 实现思路
在QTableView上覆盖多一个QTableView frozenTableView在第一列,设置frozenTableView只显示第一列
3.2 代码
TableViewEx.h
#ifndef TABLEVIEWEX_H
#define TABLEVIEWEX_H
#include <QTableView>
class TableViewEx : public QTableView {
Q_OBJECT
public:
//TableViewEx();
TableViewEx(QAbstractItemModel * model, QWidget *parent = nullptr);
~TableViewEx();
public:
//void setModel(QAbstractItemModel *model);
protected:
void resizeEvent(QResizeEvent *event) override;
QModelIndex moveCursor(CursorAction cursorAction, Qt::KeyboardModifiers modifiers) override;
void scrollTo(const QModelIndex & index, ScrollHint hint = EnsureVisible) override;
//void paintEvent(QPaintEvent *event) override;
private:
QTableView *frozenTableView;
void init();
void updateFrozenTableGeometry();
private slots:
void updateSectionWidth(int logicalIndex, int oldSize, int newSize);
void updateSectionHeight(int logicalIndex, int oldSize, int newSize);
};
#endif
TableViewEx.cpp
#include "TableViewEx.h"
#include <QScrollBar>
#include <QHeaderView>
#include <QPainter>
#include <QPaintEvent>
TableViewEx::TableViewEx(QAbstractItemModel * model, QWidget *parent)
:QTableView(parent)//使其能嵌在其他QWidget控件上
{
setModel(model);
setFocusPolicy(Qt::NoFocus);
verticalHeader()->hide();
horizontalHeader()->setSectionResizeMode(QHeaderView::Fixed);
frozenTableView = new QTableView(this);
init();
//connect the headers and scrollbars of both tableviews together
connect(horizontalHeader(), &QHeaderView::sectionResized, this,
&TableViewEx::updateSectionWidth);
connect(verticalHeader(), &QHeaderView::sectionResized, this,
&TableViewEx::updateSectionHeight);
connect(frozenTableView->verticalScrollBar(), &QAbstractSlider::valueChanged,
verticalScrollBar(), &QAbstractSlider::setValue);
connect(verticalScrollBar(), &QAbstractSlider::valueChanged,
frozenTableView->verticalScrollBar(), &QAbstractSlider::setValue);
}
//! [constructor]
TableViewEx::~TableViewEx()
{
delete frozenTableView;
}
//! [init part1]
void TableViewEx::init()
{
frozenTableView->setModel(model());
frozenTableView->setFocusPolicy(Qt::NoFocus);
frozenTableView->verticalHeader()->hide();
frozenTableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Fixed);
viewport()->stackUnder(frozenTableView);
! [init part1]
//! [init part2]
frozenTableView->setStyleSheet("QTableView { border: none;"
"background-color: #8EDE21;"
"selection-background-color: #999}"); //for demo purposes
frozenTableView->setSelectionModel(selectionModel());
for (int col = 1; col < model()->columnCount(); ++col)
frozenTableView->setColumnHidden(col, true);
frozenTableView->setColumnWidth(0, columnWidth(0));
frozenTableView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
frozenTableView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
//frozenTableView->show();
updateFrozenTableGeometry();
setHorizontalScrollMode(ScrollPerPixel);
setVerticalScrollMode(ScrollPerPixel);
frozenTableView->setVerticalScrollMode(ScrollPerPixel);
}
//! [init part2]
//! [sections]
void TableViewEx::updateSectionWidth(int logicalIndex, int /* oldSize */, int newSize)
{
if (logicalIndex == 0) {
frozenTableView->setColumnWidth(0, newSize);
updateFrozenTableGeometry();
}
}
void TableViewEx::updateSectionHeight(int logicalIndex, int /* oldSize */, int newSize)
{
frozenTableView->setRowHeight(logicalIndex, newSize);
}
//! [sections]
//void TableViewEx::setModel(QAbstractItemModel * model)
//{
frozenTableView->setModel(model);
frozenTableView->setFocusPolicy(Qt::NoFocus);
frozenTableView->verticalHeader()->hide();
frozenTableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Fixed);
viewport()->stackUnder(frozenTableView);
//! [init part1]
//! [init part2]
frozenTableView->setStyleSheet("QTableView { border: none;"
"background-color: #8EDE21;"
"selection-background-color: #999}"); //for demo purposes
frozenTableView->setSelectionModel(selectionModel());
for (int col = 1; col < model->columnCount(); ++col)
frozenTableView->setColumnHidden(col, true);
frozenTableView->setColumnWidth(0, columnWidth(0));
frozenTableView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
frozenTableView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
//frozenTableView->show();
updateFrozenTableGeometry();
setHorizontalScrollMode(ScrollPerPixel);
setVerticalScrollMode(ScrollPerPixel);
frozenTableView->setVerticalScrollMode(ScrollPerPixel);
//}
//! [resize]
void TableViewEx::resizeEvent(QResizeEvent * event)
{
QTableView::resizeEvent(event);
updateFrozenTableGeometry();
}
//! [resize]
//! [navigate]
QModelIndex TableViewEx::moveCursor(CursorAction cursorAction,
Qt::KeyboardModifiers modifiers)
{
QModelIndex current = QTableView::moveCursor(cursorAction, modifiers);
if (cursorAction == MoveLeft && current.column() > 0
&& visualRect(current).topLeft().x() < frozenTableView->columnWidth(0)) {
const int newValue = horizontalScrollBar()->value() + visualRect(current).topLeft().x()
- frozenTableView->columnWidth(0);
horizontalScrollBar()->setValue(newValue);
}
return current;
}
//! [navigate]
void TableViewEx::scrollTo(const QModelIndex & index, ScrollHint hint) {
if (index.column() > 0)
QTableView::scrollTo(index, hint);
}
//void TableViewEx::paintEvent(QPaintEvent * event)
//{
// if (event->type() == QEvent::Paint)
// {
// frozenTableView->setModel(model());
// }
//}
//
//void TableViewEx::paintEvent(QPaintEvent *event1)
//{
// if (event1->type() == QEvent::Paint)
// {
// //frozenTableView->setModel(model());
// }
// return QTableView::event(event1);
//}
//! [geometry]
void TableViewEx::updateFrozenTableGeometry()
{
frozenTableView->setGeometry(verticalHeader()->width() + frameWidth(),
frameWidth(), columnWidth(0),
viewport()->height() + horizontalHeader()->height());
}
使用:
QStandardItemModel *model = new QStandardItemModel(); //创建一个Item模型
QString line = QString("q,w,e,r,t,y,,u,i,o,p");
QStringList list = line.simplified().split(',');
model->setHorizontalHeaderLabels(list); //在Item模型的水平方向添加标签
line = QString("a,s,c,d,e");
list = line.simplified().split(',');
model->setVerticalHeaderLabels(list);//在Item模型的垂直方向添加标签
int row = 0;
QStandardItem *newItem = 0; //添加一个内容模板
line = QString("12,2,3,4,5");
if (!line.startsWith('#') && line.contains(',')) {
list = line.simplified().split(',');
for (int col = 0; col < list.length(); ++col) {
newItem = new QStandardItem(list.at(col));
model->setItem(row, col, newItem);//在Item模型添加内容
}
++row;
}
TableViewEx *t = new TableViewEx(model,ui.widget);
t->setModel(model);
t->resize(ui.widget->rect().width(), ui.widget->rect().height());
如图: