Re: Dynamic adding childs to a treestore

Hi kjell,

Thanks for fast reply and it  works


Kees Kling

On 05/10/2012 10:38 AM, Kjell Ahlstedt wrote:
Due to typedefs Gtk::TreeIter = Gtk::TreeNodeChildren::iterator = Gtk::TreeModel::iterator and Gtk::TreeRow = Gtk::TreeNodeChildren::value_type = Gtk::TreeModel::Row.

The relation between Gtk::TreeIter and the Gtk::TreeRow that it's supposed to point to is weird. If 'iter' is a Gtk::TreeModel::iterator, then *iter is a reference to iter itself, cast to a Gtk::TreeModel::Row&. I think the consequence is that you can't handle the iterators returned from sourceTreeStore->append() the way you do. 'row' in sourceViewer::appendRow() will point to a temporary object which is deleted when sourceViewer::appendRow() returns (possibly earlier).

I think you must store Gtk::TreeModel::Row objects instead of pointers. That will mean some copying of Gtk::TreeModel::Row, but I don't think you should worry too much about that being inefficient. Gtk::TreeModel::Row is a fairly small object.
I've marked in your code where I think you should change it.


2012-05-09 15:40, Kees Kling skrev:

I'm trying to build a Gtk::TreeStore object dynamically which is filled with records from a mysql table

code I'm using to build the TreeStore:

for ( vector<mysqlpp::Row>::iterator it = result.begin(); it != result.end(); ++it) { const Gtk::TreeModel::Row* runchild = source->appendRow((string)it->at(0),it->at(1),NULL);
const Gtk::TreeModel::Row runchild = source->appendRow((string)it->at(0),it->at(1),NULL);
        // getting unique runtimes of the model
        query = dbaseConnection->query();
query<<"select distinct basetime from modeldata where MID = "<<it->at(1);
for (vector<mysqlpp::Row>::iterator itr = runtime.begin(); itr != runtime.end(); ++itr) { const Gtk::TreeModel::Row* fcchild = source->appendRow((string)itr->at(0), 0,
                runchild );
const Gtk::TreeModel::Row fcchild = source->appendRow((string)itr->at(0), 0, &runchild);
source->appendRow((string)itr->at(0), 0, &runchild);
In this part I'm calling the method appendRow, which is a method of my TreeView object

const Gtk::TreeModel::Row* sourceViewer::appendRow(string name, int id,
const Gtk::TreeModel::Row sourceViewer::appendRow(string name, int id,
        const Gtk::TreeModel::Row* parent ) {
    const Gtk::TreeModel::Row* row;
const Gtk::TreeModel::Row row;
    if ( parent == NULL ) {
        //Creates a new row at the end of the top-level.
        row  = &(*(sourceTreeStore->append()));
row  = *(sourceTreeStore->append());
    } else {
        //Creates a child list
        row  = &(*(sourceTreeStore->append(parent->children())));
row  = *(sourceTreeStore->append(parent->children()));
    return row;

As long as my third parameter = NULL, thus not creating a child everything is OK, but when adding a child I get a crash and the nect error Gtk::TreeNodeChildren& Gtk::TreeRow::children() const: assertion failed: (!is_end_)

What is wrong here?????

[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]