qt tableview代理实现

来源:互联网 发布:怎样制作炒股票软件 编辑:程序博客网 时间:2024/06/05 08:49

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


添加图片到资源文件夹



2. [文件] test.zip ~ 23KB     下载(647)     

3. [文件] main.cpp ~ 273B     下载(119)     

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/**
 * @file main.cpp
 * @brief 
 * @author xiangxw
 * @version 0.0
 * @date 2011年04月30日
 */
 
#include<QApplication>
#include"MyTableView.h"
 
 
intmain(intargc,char*argv[])
{
    QApplication app(argc,argv);
 
    MyTableView table;
    table.show();
 
    returnapp.exec();
}

4. [文件] MyTableView.h ~ 1KB     下载(84)     

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
/**
 * @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>
 
classMyTableView;
classMyItemDelegate;
classMyStandardItemModel;
 
classMyTableView:publicQTableView
{
    public:
        MyTableView(QWidget * parent=0);
        virtual~ MyTableView(){}
 
    protected:
        voidmouseMoveEvent(QMouseEvent * event);
 
    private:
        MyItemDelegate * delegate;
        MyStandardItemModel * model;       
};
 
classMyItemDelegate:publicQItemDelegate
{
    public:
        MyItemDelegate(QObject * parent=0);
        virtual~ MyItemDelegate(){}
 
        voidpaint(QPainter * painter,
                constQStyleOptionViewItem & option,
                constQModelIndex & index) const;
        booleditorEvent(QEvent * event,
                QAbstractItemModel * model,
                constQStyleOptionViewItem & option,
                constQModelIndex & index);
    private:
        QPixmap favouritePixmap;
        QPixmap notFavouritePixmap;
 
};
 
classMyStandardItemModel:publicQStandardItemModel
{
    public:
        MyStandardItemModel(QObject * parent=0)
            :QStandardItemModel(parent){}
        virtual~ MyStandardItemModel(){}
         
        QVariant data(constQModelIndex & index,
                      introle=Qt::DisplayRole) const;
        QVariant headerData(intsection,
                Qt::Orientation orientation,
                introle=Qt::DisplayRole) const;
};
 
#endif

5. [文件] MyTableView.cpp ~ 3KB     下载(107)     

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
/**
 * @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=newMyItemDelegate;
    model=newMyStandardItemModel; 
    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
}
 
voidMyTableView::mouseMoveEvent(QMouseEvent * event)
{
    intcolumn=this->columnAt(event->x());
    introw=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");
}
 
voidMyItemDelegate::paint(QPainter * painter,
        constQStyleOptionViewItem & option,
        constQModelIndex & index) const
{
    if(index.column()!=0){
        QItemDelegate::paint(painter,option,index);
        return;
    }
    constQAbstractItemModel * model=index.model();
    QVariant var=model->data(index,Qt::CheckStateRole);
    if(var.isNull()) var=false;
    constQPixmap & star=var.toBool()?
                         favouritePixmap:notFavouritePixmap;
 
    intwidth=star.width();
    intheight=star.height();
    QRect rect=option.rect;
    intx=rect.x()+rect.width()/2-width/2;
    inty=rect.y()+rect.height()/2-height/2;
 
    painter->drawPixmap(x,y,star);
}
 
boolMyItemDelegate::editorEvent(QEvent * event,
        QAbstractItemModel * model,
        constQStyleOptionViewItem & /*option*/,
        constQModelIndex & index)
{
    if(event->type()==QEvent::MouseButtonPress &&
            index.column()==0){
        QVariant var=model->data(index,Qt::CheckStateRole);
        boolisFavourite=var.toBool();
        if(var.isValid())
            isFavourite=isFavourite?false:true;
        else
            isFavourite=true;
        model->setData(index,isFavourite,Qt::CheckStateRole);
        returntrue;//I have handled the event
    }
 
    returnfalse;
}
 
QVariant MyStandardItemModel::data(
        constQModelIndex & index,
        introle) const
{
    intcolumn=index.column();
 
    if(role==Qt::DisplayRole && column!=0)
        returncolumn+1;
    if(role==Qt::ToolTipRole && column==0)
        returntr("love");
    returnQStandardItemModel::data(index,role);
}
 
QVariant MyStandardItemModel::headerData(intsection,
        Qt::Orientation orientation,
        introle) const
{
    if(section==0 && orientation==Qt::Horizontal){
        if(role==Qt::DecorationRole)
            returnQIcon(":/favourite.png");
        if(role==Qt::DisplayRole)
            return"";
        if(role==Qt::ToolTipRole)
            returntr("love");
    }
    returnQStandardItemModel::headerData(section,orientation,role);
}
0 0
原创粉丝点击