Qt-在表格(QTableView)中插入图片

通过Qt的委托,可以实现自定义QTableView中每一项的特殊实现方式。

本例,利用Delegate  实现在QTableView中插入Pixmap图

 

[文件] main.cpp 
/**
* @file main.cpp
* @brief  
* @author xiangxw
* @version 0.0
* @date 2011年月日
*/ 

#include<QApplication>
#include"MyTableView.h"


int main(int argc,char *argv[])
{
	QApplication app(argc,argv);

	MyTableView table;
	table.show();

	return app.exec();
}
[文件] MyTableView.h
/**
* @file MyTableView.h
* @brief 
* @author xiangxw
* @version 0.0
* @date 2011年月日
*/

#ifndef MYTABLEVIEW_H
#define MYTABLEVIEW_H

#include<QTableView>
#include<QItemDelegate>
#include<QStandardItemModel>
#include<QPixmap>

class MyTableView;
class MyItemDelegate;
class MyStandardItemModel;

class MyTableView:public QTableView
{
public:
	MyTableView(QWidget * parent=0);
	virtual ~ MyTableView(){}

protected:
	void mouseMoveEvent(QMouseEvent * event);

private:
	MyItemDelegate * delegate;
	MyStandardItemModel * model;		
};

class MyItemDelegate:public QItemDelegate
{
public:
	MyItemDelegate(QObject * parent=0);
	virtual ~ MyItemDelegate(){}

	void paint(QPainter * painter,
		const QStyleOptionViewItem & option,
		const QModelIndex & index) const;
	bool editorEvent(QEvent * event,
		QAbstractItemModel * model,
		const QStyleOptionViewItem & option,
		const QModelIndex & index);
private:
	QPixmap favouritePixmap;
	QPixmap notFavouritePixmap;&nbsp;
};
class MyStandardItemModel:public QStandardItemModel
{
public:
	MyStandardItemModel(QObject * parent=0)
		:QStandardItemModel(parent){}
	virtual ~ MyStandardItemModel(){}
	QVariant data(const QModelIndex & index,
		int role=Qt::DisplayRole) const;
	QVariant headerData(int section,
		Qt::Orientation orientation,
		int role=Qt::DisplayRole) const;
};
#endif


[文件] MyTableView.cpp
/**
* @file MyTableView.cpp
* @brief  
* @author xiangxw
* @version 0.0
* @date 2011年月日
*/

#include<QPainter>
#include<QMouseEvent>
#include"MyTableView.h"

#ifndef NDEBUG
#include<QDebug>
#endif

MyTableView::MyTableView(QWidget * parent)
:QTableView(parent)
{
	delegate=new MyItemDelegate;
	model=new MyStandardItemModel;	
	model->setRowCount(6);
	model->setColumnCount(8);

	this->setModel(model);
	this->setItemDelegate(delegate);

	this->resizeColumnsToContents();
	this->resizeRowsToContents();
	this->setEditTriggers(QAbstractItemView::NoEditTriggers);
	this->setSelectionBehavior(QAbstractItemView::SelectRows);
	this->setMouseTracking(true);//important
}

void MyTableView::mouseMoveEvent(QMouseEvent * event)
{
	int column=this->columnAt(event->x());
	int row=this->rowAt(event->y());
	if(column==0 && row!=-1){
		this->setCursor(Qt::PointingHandCursor);
	}
	else{
		this->setCursor(Qt::ArrowCursor);
	}
}

MyItemDelegate::MyItemDelegate(QObject * parent)
:QItemDelegate(parent)
{
	favouritePixmap=QPixmap(":/favourite.png");
	notFavouritePixmap=QPixmap(":/no-favourite.png");
}

void MyItemDelegate::paint(QPainter * painter,
						   const QStyleOptionViewItem & option,
						   const QModelIndex & index) const
{
	if(index.column()!=0){
		QItemDelegate::paint(painter,option,index);
		return;
	}
	const QAbstractItemModel * model=index.model();
	QVariant var=model->data(index,Qt::CheckStateRole);
	if(var.isNull()) var=false;
	const QPixmap & star=var.toBool()?
favouritePixmap:notFavouritePixmap;

	int width=star.width();
	int height=star.height();
	QRect rect=option.rect;
	int x=rect.x()+rect.width()/2-width/2;
	int y=rect.y()+rect.height()/2-height/2;

	painter->drawPixmap(x,y,star);
}

bool MyItemDelegate::editorEvent(QEvent * event,
								 QAbstractItemModel * model,
								 const QStyleOptionViewItem & /*option*/,
								 const QModelIndex & index)
{
	if(event->type()==QEvent::MouseButtonPress &&
		index.column()==0){
			QVariant var=model->data(index,Qt::CheckStateRole);
			bool isFavourite=var.toBool();
			if(var.isValid())
				isFavourite=isFavourite?false:true;
			else
				isFavourite=true;
			model->setData(index,isFavourite,Qt::CheckStateRole);
			return true;//I have handled the event
	}

	return false;
}

QVariant MyStandardItemModel::data(
								   const QModelIndex & index,
								   int role) const
{
	int column=index.column();

	if(role==Qt::DisplayRole && column!=0)
		return column+1;
	if(role==Qt::ToolTipRole && column==0)
		return tr("love");
	return QStandardItemModel::data(index,role);
}

QVariant MyStandardItemModel::headerData(int section,
										 Qt::Orientation orientation,
										 int role) const
{
	if(section==0 && orientation==Qt::Horizontal){
		if(role==Qt::DecorationRole)
			return QIcon(":/favourite.png");
		if(role==Qt::DisplayRole)
			return "";
		if(role==Qt::ToolTipRole)
			return tr("love");
	}
	return QStandardItemModel::headerData(section,orientation,role);
}

转自:https://www.iteye.com/blog/qimo601-1538333

  • 2
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值