QT Treeview

喜歡程式設計嗎?想要一窺 KDE/Qt 程式設計的奧秘嗎?想要
學習 X Window 上的視窗程式設計嗎?歡迎各類關於 KDE/Qt、Qtopia、Qt/Embedded、QSA、PyQt 等各類心得討論。

版主: AceLan, Franklin

QT Treeview

文章jackpanda » 週四 11月 20, 2008 1:21 pm

#include "tree.h"

#include <QtGui>
#include <QApplication>
#include "treemodel.h"

class TreeModel;
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
tree w;
const QString name="tree.txt";
TreeModel* str=new TreeModel(name);//有問題的地方
w.show();
return a.exec();
}

問題:以下是所包含的.h檔
請問一下就是我傳參數進去name應該會呼叫TreeModel(QObject *parent = 0,const QString& data);因為parent參數為預設引數
所以只傳一個參數
但是會出現以下的錯誤
no matching function for call to `TreeModel::TreeModel(const QString&)' main.cpp tree 13 C/C++ Problem
然而如果我宣告不做事的建構子如TreeModel(){}
然後再main.cpp new一個TreeModel物件會產生下列狀況

可否幫忙解答謝謝

tree.h:
#ifndef TREEMODEL_H
#define TREEMODEL_H
#include <QAbstractItemModel>
#include <QModelIndex>
#include <QVariant>

class TreeItem;

class TreeModel : public QAbstractItemModel
{
Q_OBJECT

public:
TreeModel(QObject *parent = 0,const QString& data);
TreeModel(){}

~TreeModel();

QVariant data(const QModelIndex &index, int role) const;
Qt::ItemFlags flags(const QModelIndex &index) const;
QVariant headerData(int section, Qt::Orientation orientation,
int role = Qt::DisplayRole) const;
QModelIndex index(int row, int column,
const QModelIndex &parent = QModelIndex()) const;
QModelIndex parent(const QModelIndex &index) const;
int rowCount(const QModelIndex &parent = QModelIndex()) const;
int columnCount(const QModelIndex &parent = QModelIndex()) const;

private:
void setupModelData(const QStringList &lines, TreeItem *parent);
TreeModel* model;
TreeItem *rootItem;
};

#endif

tree.cpp:

#include <QtGui>
#include "treeitem.h"
#include "treemodel.h"


TreeModel::TreeModel(QObject *parent=0,const QString& data)
: QAbstractItemModel(parent)
{
QList<QVariant> rootData;
rootData << "Title" << "Summary";
rootItem = new TreeItem(rootData);
setupModelData(data.split(QString("\n")), rootItem);
}

TreeModel::~TreeModel()
{
delete rootItem;
}

int TreeModel::columnCount(const QModelIndex &parent) const
{
if (parent.isValid())
return static_cast<TreeItem*>(parent.internalPointer())->columnCount();
else
return rootItem->columnCount();
}

QVariant TreeModel::data(const QModelIndex &index, int role) const
{
if (!index.isValid())
return QVariant();

if (role != Qt::DisplayRole)
return QVariant();

TreeItem *item = static_cast<TreeItem*>(index.internalPointer());

return item->data(index.column());
}

Qt::ItemFlags TreeModel::flags(const QModelIndex &index) const
{
if (!index.isValid())
return 0;

return Qt::ItemIsEnabled | Qt::ItemIsSelectable;
}

QVariant TreeModel::headerData(int section, Qt::Orientation orientation,
int role) const
{
if (orientation == Qt::Horizontal && role == Qt::DisplayRole)
return rootItem->data(section);

return QVariant();
}

QModelIndex TreeModel::index(int row, int column, const QModelIndex &parent)
const
{
if (!hasIndex(row, column, parent))
return QModelIndex();

TreeItem *parentItem;

if (!parent.isValid())
parentItem = rootItem;
else
parentItem = static_cast<TreeItem*>(parent.internalPointer());

TreeItem *childItem = parentItem->child(row);
if (childItem)
return createIndex(row, column, childItem);
else
return QModelIndex();
}

QModelIndex TreeModel::parent(const QModelIndex &index) const
{
if (!index.isValid())
return QModelIndex();

TreeItem *childItem = static_cast<TreeItem*>(index.internalPointer());
TreeItem *parentItem = childItem->parent();

if (parentItem == rootItem)
return QModelIndex();

return createIndex(parentItem->row(), 0, parentItem);
}

int TreeModel::rowCount(const QModelIndex &parent) const
{
TreeItem *parentItem;
if (parent.column() > 0)
return 0;

if (!parent.isValid())
parentItem = rootItem;
else
parentItem = static_cast<TreeItem*>(parent.internalPointer());

return parentItem->childCount();
}

void TreeModel::setupModelData(const QStringList &lines, TreeItem *parent)
{
QList<TreeItem*> 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 TreeItem(columnData, parents.last()));
}

number++;
}
}

treeitem.h

#ifndef TREEITEM_H
#define TREEITEM_H

#include <QList>
#include <QVariant>

class TreeItem
{
public:
TreeItem(const QList<QVariant> &data, TreeItem *parent = 0);
~TreeItem();

void appendChild(TreeItem *child);

TreeItem *child(int row);
int childCount() const;
int columnCount() const;
QVariant data(int column) const;
int row() const;
TreeItem *parent();

private:
QList<TreeItem*> childItems;
QList<QVariant> itemData;
TreeItem *parentItem;
};

#endif

tree.cpp

#include <QStringList>
#include "treeitem.h"

TreeItem::TreeItem(const QList<QVariant> &data, TreeItem *parent)
{
parentItem = parent;
itemData = data;
}

TreeItem::~TreeItem()
{

}

void TreeItem::appendChild(TreeItem *item)
{
childItems.append(item);
}

TreeItem *TreeItem::child(int row)
{
return childItems.value(row);
}

int TreeItem::childCount() const
{
return childItems.count();
}

int TreeItem::columnCount() const
{
return itemData.count();
}

QVariant TreeItem::data(int column) const
{
return itemData.value(column);
}

TreeItem *TreeItem::parent()
{
return parentItem;
}

int TreeItem::row() const
{
if (parentItem)
return parentItem->childItems.indexOf(const_cast<TreeItem*>(this));

return 0;
}
jackpanda
可愛的小學生
可愛的小學生
 
文章: 1
註冊時間: 週四 11月 20, 2008 1:13 pm

文章legnaleurc » 週四 11月 20, 2008 5:31 pm

TreeModel(QObject *parent = 0,const QString& data);
這種宣告根本是沒有意義的
預設引數是由右往左展開
所以你還是要傳二個參數進去
正確的寫法是
TreeModel(const QString& data,QObject *parent = 0);
legnaleurc
可愛的小學生
可愛的小學生
 
文章: 62
註冊時間: 週四 6月 21, 2007 10:36 am


回到 KDE/Qt 程式設計

誰在線上

正在瀏覽這個版面的使用者:沒有註冊會員 和 1 位訪客