PDA

View Full Version : Version 4.1.3 and QTreeView



greencastor
11th June 2006, 11:58
Hello,
I had a QTreeView linked with a model and a delegate, which worked wonderfully under Qt 4.1.1 but when I try the new release 4.1.3, I have a problem in the coordinate function of QTreeView (this function is not the same in qt 4.1.1 & qt 4.1.3).
There seems to be a problem when I open the delegate and then I move my mouse in the blank space of my view : I have qassert(false).
Above the coordinate function, there is a note :

if this is ever changed to not estimate then update item()

I don't see what it means. Do you ? :confused:

fullmetalcoder
11th June 2006, 12:03
Any code to give us??? I don' understand exactly what is your problem...

greencastor
13th June 2006, 11:37
here it is. the problem is when you edit the line "toto" and then you move your mouse in the blank space of the window.
This is inspired by the simple tree example. I added a delegate.


delegate :
------------------------------------
DelegateCaracs::DelegateCaracs( QObject *parent): QItemDelegate(parent){}

QWidget *DelegateCaracs::createEditor(QWidget *parent, const QStyleOptionViewItem & option, const QModelIndex &index) const
{
return new QPushButton(parent);
}

view :
----------------------------------------------
ueSelects::VueSelects():QTreeView(){

// on utilise un delegate pour avoir un affichage personnalise



DelegateCaracs* del=new DelegateCaracs(this );

setItemDelegate(del);

header()->hide();



// on autorise le drag and drop

setDragEnabled(true);

setAcceptDrops(true);

setDropIndicatorShown(true);



setSelectionMode(QAbstractItemView::ExtendedSelect ion);



// la selection est de couleur jaune (sinon sous linux on ne voit pas le texte)

QPalette p = palette();

QColor couleurJaunePale = QColor(Qt::white);

couleurJaunePale.setRgb(243,247,126);

QBrush yellowBrush(couleurJaunePale);

p.setBrush(QPalette::Highlight,yellowBrush);

setPalette(p);





}



itemModel
------------------------------------------------
#include <QStringList>

#include "treeitem.h"

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

TreeItem::~TreeItem()
{
qDeleteAll(childItems);
}

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;
}


Model
---------------------------
TreeModel::TreeModel(const QString &data, QObject *parent)
: 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 Qt::ItemIsEnabled;

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

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
{
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.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;
qDebug("%d", lines.size());
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++;
}
}

and main
-------------------------
int main(int argc, char *argv[])
{


QApplication app(argc, argv);


TreeModel model("toto");

VueSelects view;
view.setModel(&model);
view.setWindowTitle(QObject::tr("Simple Tree Model"));
view.show();
return app.exec();
}