注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

沙漠里de烟雨

原创分享,禁止转载

 
 
 

日志

 
 

Qt---在QTableView中添加 QspinBox控件  

2013-12-29 18:28:12|  分类: QT5.x与QML |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
OrderModel* model = new OrderModel(orderDataList);
this->setModel(model);
SpinBoxDelegate* delegate = new SpinBoxDelegate;
//this->setItemDelegate(delegate);
this->setItemDelegateForColumn(2,delegate);

this->setSelectionBehavior(QAbstractItemView::SelectItems);
this->verticalHeader()->setVisible(false);
this->setSelectionMode(QAbstractItemView::SingleSelection);
this->resizeColumnsToContents();
this->resizeRowsToContents();
this->horizontalHeader()->setStretchLastSection(true);
this->setAlternatingRowColors(true);
this->setMouseTracking(true);


#ifndef SPINBOXDELEGATE_H
#define SPINBOXDELEGATE_H

#include <QItemDelegate>

class SpinBoxDelegate : public QItemDelegate
{
    Q_OBJECT
public:
    SpinBoxDelegate(QObject *parent = 0);

public:
//当双击表格里的某一个元素时,会调用这个函数,创造一个Editor
    QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option,const QModelIndex &index) const;
// 用于把模型的数据传递给代理类的控件
void setEditorData(QWidget *editor, const QModelIndex &index) const;
    // 用于提交修改的数据
void setModelData(QWidget *editor, QAbstractItemModel *model,const QModelIndex &index) const;
void updateEditorGeometry(QWidget *editor,const QStyleOptionViewItem &option, const QModelIndex &index) const;

};

#endif


#include "SpinBoxDelegate.h"

#include <QSpinBox>
#include "OrderModel.h"


SpinBoxDelegate::SpinBoxDelegate(QObject *parent) : QItemDelegate(parent)
{
}

QWidget *SpinBoxDelegate::createEditor(QWidget *parent,const QStyleOptionViewItem & option ,const QModelIndex & index ) const
{
if(index.column()==2)
{
QSpinBox *spinBox = new QSpinBox(parent);
spinBox->setFrame(false);
spinBox->setMinimum(1);
spinBox->setMaximum(100);
return spinBox;
}
    return  QItemDelegate::createEditor(parent, option, index);
}
void SpinBoxDelegate::setEditorData(QWidget *editor,const QModelIndex &index) const
{
if(index.column()==2)
{
QSpinBox *spinBox = static_cast<QSpinBox*>(editor);
spinBox->setValue(index.model()->data(index,Qt::DisplayRole).toInt());
}
else
QItemDelegate::setEditorData(editor, index);
}
void SpinBoxDelegate::setModelData(QWidget *editor, QAbstractItemModel *model,const QModelIndex &index) const
{
if(index.column()==2)
{
QSpinBox *spinBox  = static_cast<QSpinBox*>(editor);
spinBox->interpretText();
int value = spinBox->value();     
model->setData(index, value, Qt::EditRole);
}
else
QItemDelegate::setModelData(editor, model, index);
}
void SpinBoxDelegate::updateEditorGeometry(QWidget *editor,const QStyleOptionViewItem &option, const QModelIndex & index ) const
{
if(index.column()==2)
editor->setGeometry(option.rect);
else
QItemDelegate::updateEditorGeometry(editor,option,index);
}



此外,
在model中:

QVariant OrderModel::data(const QModelIndex &index, int role) const
{
    if (!index.isValid())
        return QVariant();
if (index.row() >= m_OrderList.size() || index.row() < 0)
        return QVariant();
if(role==Qt::TextAlignmentRole)
{
return Qt::AlignCenter;
}
OrderData orderData = m_OrderList[index.row()];
if(role == Qt::DisplayRole)
{
if(index.column()==1)
return orderData.GetOpenOrder();
}
if(role==Qt::CheckStateRole && index.column()==0)
{
return (orderData.IsClose()) ? (Qt::Checked) : (Qt::Unchecked);
}
if(role==Qt::DisplayRole && index.column()==2) ///////////////////-------spinbox
{
return orderData.GetLot();
}
if(role==Qt::TextColorRole && index.column()==1)
{
return QColor(orderData.IsBid() ? Qt::blue : Qt::red );
}

return QVariant();
}
QVariant OrderModel::headerData(int section, Qt::Orientation orientation, int role) const
{
    if (role != Qt::DisplayRole)
        return QVariant();

if (orientation == Qt::Horizontal)
{
switch (section)
{
case 0:
return "Close";
case 1:
return "Open Order";
case 2:
return "Lot";   //////////////////--spinbox
default:
break;
}
}

return QVariant();
}
Qt::ItemFlags OrderModel::flags(const QModelIndex &index) const
{
    if (!index.isValid())
        return Qt::ItemIsEnabled;

Qt::ItemFlags flags = QAbstractTableModel::flags(index);
if(index.column()==0)
flags |= (Qt::ItemIsUserCheckable);
else if(index.column()==2)  ////////////////////////-----spinbox;
flags |= Qt::ItemIsEditable;

return  flags;
}
bool OrderModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
if(index.isValid() )
{
if(role==Qt::CheckStateRole && index.column()==0)
{
m_OrderList[index.row()].SetClose(!m_OrderList[index.row()].IsClose());
emit dataChanged(index,index);
return true;
}
if(role==Qt::EditRole && index.column()==2)  ////////////////----spinbox;
{
m_OrderList[index.row()].SetLot(value.toInt());
emit dataChanged(index,index);
return true;
}

}

return false;
}
  评论这张
 
阅读(2075)| 评论(0)
推荐

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017