QTableView和QTableWidget使用、重写QTableView

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

效果如图

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());

如图:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值