Qt4 用多列树视图实现QabstracteModel

Qt4 用多列树视图实现QabstracteModel,qt4,qtreeview,qabstractitemmodel,Qt4,Qtreeview,Qabstractitemmodel,我正在尝试为多列树视图实现QabstracteModel每列都是一个qstring,但是GUI中到目前为止还没有出现数据,也不知道为什么,请帮助plz #ifndef PACKETLISTMODEL_H #define PACKETLISTMODEL_H #include <QAbstractItemModel> #include<QVector> #include<QStringList> class PacketListModel : public Q

我正在尝试为多列树视图实现QabstracteModel每列都是一个qstring,但是GUI中到目前为止还没有出现数据,也不知道为什么,请帮助plz

#ifndef PACKETLISTMODEL_H
#define PACKETLISTMODEL_H

#include <QAbstractItemModel>
#include<QVector>
#include<QStringList>

class PacketListModel : public QAbstractItemModel
{
    Q_OBJECT
public:
    explicit PacketListModel(QObject *parent = 0);
    ~PacketListModel();

    QModelIndex index(int row, int column,
                      const QModelIndex &parent = QModelIndex()) const;
    QModelIndex parent(const QModelIndex &index) const;
    void clear();
    int rowCount(const QModelIndex &parent = QModelIndex()) const;
    int columnCount(const QModelIndex &parent = QModelIndex()) const;
    QVariant data(const QModelIndex &index, int role) const;
    QVariant headerData(int section, Qt::Orientation orientation,
                             int role = Qt::DisplayRole) const;
    void appendPacket(QStringList*);
    QStringList* getPacket(int row);
signals:

public slots:

private:
    QVector<QStringList*> pkts;
};

#endif // PACKETLISTMODEL_H
\ifndef PACKETLISTMODEL\u H
#定义PACKETLISTMODEL_H
#包括
#包括
#包括
类PacketListModel:公共QabStructItemModel
{
Q_对象
公众:
显式PacketListModel(QObject*parent=0);
~PacketListModel();
QModelIndex索引(int行,int列,
常量QModelIndex&parent=QModelIndex())常量;
QModelIndex父项(常数QModelIndex&index)常数;
无效清除();
int rowCount(常量QModelIndex&parent=QModelIndex())常量;
int columnCount(常量QModelIndex&parent=QModelIndex())常量;
QVariant数据(常量QModelIndex&index,int角色)常量;
QVariant headerData(内部部分,Qt::方向,
int role=Qt::DisplayRole)const;
无效数据包(QStringList*);
QStringList*getPacket(int行);
信号:
公众时段:
私人:
qvectorpkts;
};
#endif//PACKETLISTMODEL_H
==============================================================================

 #include "packetlistmodel.h"
    #include<QStandardItem>
    PacketListModel::PacketListModel(QObject *parent) :
        QAbstractItemModel(parent)
    {
    }
    QModelIndex PacketListModel::index(int row, int column, const QModelIndex &parent) const{
        Q_UNUSED(parent);
        if (row >= pkts.count() || row < 0 || column >= 8)
            return QModelIndex();

        QStringList *pkt = pkts[row];

        return createIndex(row, column, pkt);

    }

    QModelIndex PacketListModel::parent(const QModelIndex &index) const
    {
        Q_UNUSED(index);
        return QModelIndex();
    }
    void PacketListModel::clear() {
        beginResetModel();
        pkts.clear();
        endResetModel();
    }

    int PacketListModel::rowCount(const QModelIndex &parent) const
    {
        if (parent.column() >= 8)
            return 0;

        return pkts.size();
    }

    int PacketListModel::columnCount(const QModelIndex &parent) const
    {
        Q_UNUSED(parent);
        return 8;
    }
    QVariant PacketListModel::data(const QModelIndex &index, int role) const{



        if (!index.isValid())
            return QVariant();

        if (index.row() >= pkts.size() || index.row() < 0)
            return QVariant();

        if (role == Qt::DisplayRole) {
            //    QStringList pkt=static_cast<QStringList>(index.internalPointer());
            QStringList *pkt=pkts.at(index.row());
            if (index.column() == 0)
                return pkt->at(0);
            else if (index.column() == 1)
                return pkt->at(1);
            else if (index.column() == 2)
                return pkt->at(2);
            else if (index.column() == 3)
                return pkt->at(3);
            else if (index.column() == 4)
                return pkt->at(4);
            else if (index.column() == 5)
                return pkt->at(5);
            else if (index.column() == 6)
                return pkt->at(6);
            else if (index.column() == 7)
                return pkt->at(7);
        }
        return QVariant();

    }


    QVariant PacketListModel::headerData(int section, Qt::Orientation orientation,
                                         int role /*= Qt::DisplayRole*/) const{
        if (orientation == Qt::Horizontal && role == Qt::DisplayRole) {
            if (section == 0) {
                return tr("Num");
            } else if (section == 1) {
                return tr("Time");
            } else if (section == 2) {
                return tr("Length");
            } else if (section == 3) {
                return tr("Source IP");
            } else if (section == 4) {
                return tr("Source Port");
            } else if (section == 5) {
                return tr("Protocol");
            } else if (section == 6) {
                return tr("Destination IP");
            } else if (section == 7) {
                return tr("Destination Port");
            }
        }
        return QVariant();

    }
    void PacketListModel::appendPacket(QStringList*pkt){
        if(pkt->size()==8){
             beginInsertRows(QModelIndex(), pkts.size(), pkts.size());
            pkts.append(pkt);
          endInsertRows();
        }
    }

    QStringList* PacketListModel::getPacket(int row){
        if(row >= 0 || row <= pkts.count())
            return pkts[row];
    }
    PacketListModel::~PacketListModel(){
        pkts.clear();
    }
#包括“packetlistmodel.h”
#包括
PacketListModel::PacketListModel(QObject*parent):
QAbstracteModel(父级)
{
}
QModelIndex PacketListModel::index(int行、int列、常量QModelIndex&parent)常量{
Q_未使用(父母);
如果(行>=pkts.count()| |行<0 | |列>=8)
返回QModelIndex();
QStringList*pkt=pkts[row];
返回createIndex(行、列、pkt);
}
QModelIndex PacketListModel::父(常量QModelIndex&index)常量
{
Q_(指数);
返回QModelIndex();
}
void PacketListModel::clear(){
beginResetModel();
pkts.clear();
endResetModel();
}
int PacketListModel::行计数(常量QModelIndex&parent)常量
{
if(parent.column()>=8)
返回0;
返回pkts.size();
}
int PacketListModel::columnCount(常量QModelIndex&parent)常量
{
Q_未使用(父母);
返回8;
}
QVariant PacketListModel::数据(常量QModelIndex&index,int角色)常量{
如果(!index.isValid())
返回QVariant();
如果(index.row()>=pkts.size()| | index.row()<0)
返回QVariant();
如果(角色==Qt::DisplayRole){
//QStringList pkt=static_cast(index.internalPointer());
QStringList*pkt=pkts.at(index.row());
if(index.column()==0)
返回pkt->at(0);
else if(index.column()==1)
返回pkt->at(1);
else if(index.column()==2)
返回pkt->at(2);
else if(index.column()==3)
返回pkt->at(3);
else if(index.column()==4)
返回pkt->at(4);
else if(index.column()=5)
返回pkt->at(5);
else if(index.column()==6)
返回pkt->at(6);
else if(index.column()==7)
返回pkt->at(7);
}
返回QVariant();
}
QVariant PacketListModel::headerData(int部分,Qt::方向,
int role/*=Qt::DisplayRole*/)常量{
if(方向==Qt::水平和角色==Qt::显示角色){
如果(节==0){
返回tr(“Num”);
}else if(节==1){
返回tr(“时间”);
}否则如果(节==2){
返回tr(“长度”);
}否则如果(节==3){
返回tr(“源IP”);
}否则如果(节==4){
返回tr(“源端口”);
}否则如果(节==5){
返回tr(“协议”);
}否则如果(节==6){
返回tr(“目的地IP”);
}否则如果(节==7){
返回tr(“目的港”);
}
}
返回QVariant();
}
void PacketListModel::appendPacket(QStringList*pkt){
如果(pkt->size()==8){
beginInsertRows(QModelIndex(),pkts.size(),pkts.size());
pkts.append(pkt);
endInsertRows();
}
}
QStringList*PacketListModel::getPacket(int行){
如果(行>=0 | |行<代码>#包括“packetlistmodel.h”
#包括
#包括
PacketListModel::PacketListModel(QObject*parent):
QAbstracteModel(父级)
{
}
QModelIndex PacketListModel::index(int行、int列、常量QModelIndex&parent)常量{
Q_未使用(父母);
如果(行>=pkts.size()| |行<0 | |列>=8)
返回QModelIndex();
QStringList pkt=pkts.at(世界其他地区);
返回createIndex(行、列和pkt);
}
QModelIndex PacketListModel::父(常量QModelIndex&index)常量
{
Q_(指数);
返回QModelIndex();
}
void PacketListModel::clear(){
beginResetModel();
pkts.clear();
endResetModel();
}
int PacketListModel::行计数(常量QModelIndex&parent)常量
{
////////没有孩子/////////////////////////
if(parent.isValid())
返回0;
返回pkts.size();
///////////////////////////////////////////
}
int PacketListModel::columnCount(常量QModelIndex&parent)常量
{
Q_未使用(父母);
返回8;
}
QVariant PacketListModel::数据(常量QModelIndex&index,int角色)常量{
如果(!index.isValid())
返回QVariant();
如果(index.row()>=pkts.size()| | index.row()<0)
返回QVariant();
if(role==Qt::DisplayRole&&index.isValid()){
QStringList pkt=pkts.at(index.row());
if(index.column()==0)
返回包装(0);
else if(index.column()==1)
返回包装(1);
else if(index.column()==2)
返回包装(2);
#include "packetlistmodel.h"
#include<QStandardItem>
#include<QDebug>

PacketListModel::PacketListModel(QObject *parent) :
    QAbstractItemModel(parent)
{

}
QModelIndex PacketListModel::index(int row, int column, const QModelIndex &parent) const{
    Q_UNUSED(parent);
        if (row >= pkts.size() || row < 0 || column >= 8)
            return QModelIndex();

        QStringList pkt = pkts.at(row);
        return createIndex(row, column, &pkt);
}

QModelIndex PacketListModel::parent(const QModelIndex &index) const
{
    Q_UNUSED(index);
    return QModelIndex();
}
void PacketListModel::clear() {
    beginResetModel();
    pkts.clear();
    endResetModel();
}

int PacketListModel::rowCount(const QModelIndex &parent) const
{
////////no children/////////////////////////
    if(parent.isValid())
        return 0;
    return pkts.size();
///////////////////////////////////////////

}

int PacketListModel::columnCount(const QModelIndex &parent) const
{
    Q_UNUSED(parent);
    return 8;
}
QVariant PacketListModel::data(const QModelIndex &index, int role) const{



    if (!index.isValid())
        return QVariant();

    if (index.row() >= pkts.size() || index.row() < 0)
        return QVariant();

    if (role == Qt::DisplayRole && index.isValid()) {

        QStringList pkt = pkts.at(index.row());


        if (index.column() == 0)
            return pkt.at(0);
        else if (index.column() == 1)
            return pkt.at(1);
        else if (index.column() == 2)
            return pkt.at(2);
        else if (index.column() == 3)
            return pkt.at(3);
        else if (index.column() == 4)
            return pkt.at(4);
        else if (index.column() == 5)
            return pkt.at(5);
        else if (index.column() == 6)
            return pkt.at(6);
        else if (index.column() == 7)
            return pkt.at(7);
    }
    return QVariant();

}


QVariant PacketListModel::headerData(int section, Qt::Orientation orientation,
                                     int role /*= Qt::DisplayRole*/) const{
    if (orientation == Qt::Horizontal && role == Qt::DisplayRole) {
        if (section == 0) {
            return tr("Num");
        } else if (section == 1) {
            return tr("Time");
        } else if (section == 2) {
            return tr("Length");
        } else if (section == 3) {
            return tr("Source IP");
        } else if (section == 4) {
            return tr("Source Port");
        } else if (section == 5) {
            return tr("Protocol");
        } else if (section == 6) {
            return tr("Destination IP");
        } else if (section == 7) {
            return tr("Destination Port");
        }
    }
    return QVariant();

}
bool PacketListModel::setData(const QModelIndex &index,const QVariant &value, int role)
{
    bool result = false;

    if (index.isValid() && role == Qt::EditRole) {
        QStringList pkt =value.toString().split("\t");
        int idx = index.row();
        pkts.replace(idx, pkt);//problem was here it should take value not pointer
        emit dataChanged(index, index);
        result =  true;
    }

    return result;
}
bool PacketListModel::insertRow(int position, const QModelIndex &parent)
{
    Q_UNUSED(parent);
    beginInsertRows(QModelIndex(), position, position);
    QStringList qs;
    pkts.insert(position,qs);
    endInsertRows();
    return true;
}

PacketListModel::~PacketListModel(){
    pkts.clear();
}