当前访客身份:游客 [ 登录 | 加入 OSCHINA ]

代码分享

当前位置:
代码分享 » C/C++  » 图形界面开发/GUI/CGI
分享到: 
收藏 +0
1

代码片段(5) [全屏查看所有代码]

1. [图片] Screenshot-无标题窗口.png    

2. [文件] test.zip ~ 23KB     下载(887)     [全屏预览]

3. [文件] main.cpp ~ 273B     下载(151)     跳至 [3] [4] [5] [全屏预览]

/**
 * @file main.cpp
 * @brief  
 * @author xiangxw
 * @version 0.0
 * @date 2011年04月30日
 */

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


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

	MyTableView table;
	table.show();

	return app.exec();
}

4. [文件] MyTableView.h ~ 1KB     下载(105)     跳至 [3] [4] [5] [全屏预览]

/**
 * @file MyTableView.h
 * @brief 
 * @author xiangxw
 * @version 0.0
 * @date 2011年04月30日
 */

#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;

};

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

5. [文件] MyTableView.cpp ~ 3KB     下载(129)     跳至 [3] [4] [5] [全屏预览]

/**
 * @file MyTableView.cpp
 * @brief  
 * @author xiangxw
 * @version 0.0
 * @date 2011年04月30日
 */

#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);
}


开源中国-程序员在线工具:Git代码托管 API文档大全(120+) JS在线编辑演示 二维码 更多»

发表评论 回到顶部 网友评论(8)

  • 1楼:NeverDizzy 发表于 2012-07-09 22:53 回复此评论
    好贴!楼主请教如何往QTableView中添加QCheckBox和QPushButton,谢谢!
  • 2楼:NeverDizzy 发表于 2012-07-09 22:53 回复此评论
    需要代理的方式实现
  • 3楼:alenstarx 发表于 2013-09-28 11:38 回复此评论
    参考参考, 谢谢啦
  • 4楼:zjb1025 发表于 2013-11-07 19:15 回复此评论
    楼主,请教下,需要表格中单元格中画线,能实现吗,最好是一个单元中能画10条垂直线?
  • 5楼:xiangxw 发表于 2013-11-08 21:39 回复此评论

    引用来自“zjb1025”的评论

    楼主,请教下,需要表格中单元格中画线,能实现吗,最好是一个单元中能画10条垂直线?
    在delegate的paint函数里面画就好了
  • 6楼:smartgps2008 发表于 2014-01-11 18:52 回复此评论
    谢谢
  • 7楼:liushiyanyan 发表于 2014-04-15 14:04 回复此评论
    非常感谢
  • 8楼:Marcelxx 发表于 2014-09-18 20:54 回复此评论
    请问,第一列的表头上的星星是怎么画上去的?我下了你的代码,还是表头上没有星星。
开源从代码分享开始 分享代码
xiangxw的其它代码 全部(6)...