• 4561阅读
  • 6回复

[已解决]关于Model/View 数据项(Item)的问题 [复制链接]

上一主题 下一主题
离线bingogo
 
只看楼主 正序阅读 楼主  发表于: 2009-05-22
— 本帖被 XChinux 从 General Qt Programming 移动到本区(2011-01-02) —
先说要实现的效果(不会贴图,只好简陋行事啦)

要做一个网络管理软件,要求实现PC分组功能,
一个主窗口,分两部分显示

左边的效果
==============
+group1
    +group1.1
    +group1.2
        - PC1
         -PC2
+group2
    +group2.1
         -PC3
         -PC4
    +group2.2

右边的效果
==========
比如在左边点击group1.2
会出现下属的PC1和PC2


所以我现在用MODEL/VIEW建立一个自定义的树形模型
参考Simple TreeModel 按照下列步骤进行
1. 建立数据项类 ( Class Item )
2. 建立模型类 ( Class TreeModel )
3. 向数据项写入数据
4. 在窗口用QTreeView和QListView显示

现在的问题是,我不知道怎么建立数据项类,
因为有两种不同的类型( Group 和 PC ),
且PC包含一些属性( name, ip , status, etc.. )

应该怎么解决呢?
[ 此帖被bingogo在2009-05-22 17:34重新编辑 ]
离线bingogo
只看该作者 6楼 发表于: 2009-05-22
自己解决啦……

int Node::columnCount() const
{
    return NodeData.count();
// return 3;
}

int TreeModel::columnCount(const QModelIndex &parent) const
{
     if (parent.isValid())
//问题就出在这里!!
         return static_cast<Node*>(parent.internalPointer())->columnCount();
     else
         return rootNode->columnCount();
}

因为我是这样给组的数据项赋值的
     QList<QVariant> columnData;
                 columnData << "Group1"  ;

这样就好啦
     QList<QVariant> columnData;
                 columnData << "Group1"  << "" << "" ;
离线bingogo
只看该作者 5楼 发表于: 2009-05-22
我尝试了一下显示Column中的数据,IP和Stutus这两个字符串是已经保存了

但是就是显示不出来,怎么回事呢?
离线bingogo
只看该作者 4楼 发表于: 2009-05-22
参考的是Simple Tree Model 的例子,只是把输入参数给去了,我自己填充数据项
以下的是原例子的代码


void IAMTTreeModel::setupModelData(const QStringList &lines, Node *parent)
{
     QList<Node*> parents;
     QList<int> indentations;
     parents << parent;
     indentations << 0;

     int number = 0;

     while (number < lines.count()) {
         int position = 0;
         while (position < lines[number].length()) {
             if (lines[number].mid(position, 1) != " ")
                 break;
             position++;
         }

         QString lineData = lines[number].mid(position).trimmed();

         if (!lineData.isEmpty())
    {
             // Read the column data from the rest of the line.
             QStringList columnStrings = lineData.split("\t", QString::SkipEmptyParts);
             QList<QVariant> columnData;
             for (int column = 0; column < columnStrings.count(); ++column)
                 columnData << columnStrings[column];

             if (position > indentations.last())
        {
                 // The last child of the current parent is now the new parent
                 // unless the current parent has no children.

                 if (parents.last()->childCount() > 0)
        {
                     parents << parents.last()->child(parents.last()->childCount()-1);
                     indentations << position;
                 }
             }
         else
        {
                 while (position < indentations.last() && parents.count() > 0)
        {
                     parents.pop_back();
                     indentations.pop_back();
                 }
             }

             // Append a new item to the current parent's list of children.
             parents.last()->appendChild(new Node(columnData, parents.last()));
         }

         number++;
     }
}
离线bingogo
只看该作者 3楼 发表于: 2009-05-22
遇到一个很奇怪的问题……
TreeModel::TreeModel( QObject *parent )
     : QAbstractItemModel(parent)
{
     QList<QVariant> rootData;
     rootData << "Name" << "IP" << "Status";
     rootNode = new Node(rootData);
     setupModelData( rootNode );
}

void TreeModel::setupModelData( Node *parent )
{
     QList<Node*> parents;
     parents << parent;  //第一个节点是rootNode

     QList<QVariant> columnData;
     columnData << "Group1" ;
     parents.last()->appendChild(new Node(columnData, parents.last()));
     parents << parents.last()->child(parents.last()->childCount()-1);    //将Group1作为下一个父亲节点

     columnData.clear();
     columnData << "PC1" << "10.3.0.27" << "Power On" ;
     parents.last()->appendChild(new Node(columnData, parents.last()));


编译通过,运行时候居然只有 "Name"下显示正确信息,
而IP和Status下显示空白,这是怎么回事??

有遇到过这种情况的吗?
离线bingogo
只看该作者 2楼 发表于: 2009-05-22
楼上正解!
离线hercules

只看该作者 1楼 发表于: 2009-05-22
class YourData
{
   enum { GROUP,PC}
   QString name;
   int type;
   QList<YourData*> childList;
};

QList<YourData*> yourDataList;
我的QQ号:337396132
欢迎大家加我为好友,一起学习Qt
快速回复
限100 字节
 
上一个 下一个