Seite 1 von 1

[GELÖST] QTreeWidget und SIGNAL itemDoubleClicked() wie ausw

Verfasst: 30. Dezember 2007 10:16
von gboelter
Ich habge heute zum ersten Mal QTreeWidget eingesetzt und stosse dabei natuerlich auch gleich auf ein Problem.

Ich habe mit ...

Code: Alles auswählen

connect( treeWidget, SIGNAL( itemDoubleClicked( QTreeWidgetItem *, int ) ), this, SLOT( showSetup2() ) );
... ein SIGNAL, welches auch abgearbeitet wird, doch wie erfahre ich jetzt, auf welches Element geklickt wurde?

Sorry, aber an der Stelle werde ich aus der Doku einfach nicht schlau.

Kann mir da mal jemand helfen?

Danke im voraus.

Verfasst: 30. Dezember 2007 10:57
von patrik08
Wichtig man macht sich ein tree model mit dem einfachen QStandardItemModel

beispiel von datenbank mysql;

doc: http://www.klempert.de/nested_sets/
demo: http://www.klempert.de/nested_sets/demo/

Code: Alles auswählen

CREATE TABLE `FAKTURA_SUB` (
  `id` int(12) NOT NULL auto_increment,
  `root_id` int(12) NOT NULL default '0',
  `name` varchar(35) NOT NULL default 'Category-Name-New',
  `lft` int(12) NOT NULL default '0',
  `rgt` int(12) NOT NULL default '0',
  `sub_id` int(12) NOT NULL default '1',
  `attribute` enum('active','passive','report_a','report_b','report_c','read','hidden') NOT NULL default 'read',
  PRIMARY KEY  (`id`),
  UNIQUE KEY `sub_id` (`sub_id`),
  KEY `root_id` (`root_id`),
  KEY `lft` (`lft`),
  KEY `rgt` (`rgt`)
) ENGINE=MyISAM AUTO_INCREMENT=218 DEFAULT CHARSET=utf8 AUTO_INCREMENT=218 ;
        
dann definiert man die sql query die den baum macht unlimitierte tiefen:

Code: Alles auswählen

#define V_TREEQUERY "SELECT n.*, round((n.rgt-n.lft-1)/2,0) AS childs, count(*)+(n.lft>1) AS level, ((min(p.rgt)-n.rgt-(n.lft>1))/2) > 0 AS lower, (( (n.lft-max(p.lft)>1) )) AS upper FROM FAKTURA_SUB n, FAKTURA_SUB p WHERE n.lft BETWEEN p.lft AND p.rgt AND (p.root_id = n.root_id) AND (p.id != n.id OR n.lft = 1) GROUP BY n.root_id,n.id ORDER BY n.root_id,n.lft"

man ruft die query auf...

Code: Alles auswählen

ReadModel = new QSqlQueryModel();
ReadModel->setQuery(F_TREEQUERY,db_connection);  /* QSqlDatabase */


/*  header auslesen */
int rowsumm = ReadModel->columnCount();
    for (int x = 0; x < rowsumm; ++x) {
        const int pane = x;
        FieldNames.append(ReadModel->headerData(pane,Qt::Horizontal,Qt::DisplayRole).toString());
    }
    model = new QStandardItemModel();  //// model beginnen //////

/* header schreiben */
    for (int e = 0; e < DisplayFields.size(); ++e) {
        model->setHorizontalHeaderItem(e,new QStandardItem(DisplayFields.at(e)));
    }

/* alle tree aufuellen vom ersten level + Compose geht in die tiefe ...*/

if (ReadModel->rowCount() > 0) {
        
        for (int i = 0; i < ReadModel->rowCount(); ++i) {
              QSqlRecord recordio = ReadModel->record(i);
              if (recordio.value("level").toInt() == 1) {
                 model->invisibleRootItem()->appendRow(Compose(i));
              }
            
        }
    }

/* und die tree selber   Compose( int zeile )*/

QList<QStandardItem *> Classe::Compose( int rowposition )
{
    QSqlRecord r = ReadModel->record(rowposition);
    int level;
    int childs;
    QString RowPositionString,DBid;
    RowPositionString.setNum(rowposition);
    QList<QStandardItem *> diritto;
    for (int x = 0; x < DisplayFields.size(); ++x) {
                    level = r.value("level").toInt();
                    childs = r.value("childs").toInt();
                    DBid = r.value("id").toString();
                    const QString Fname = DisplayFields.at(x);
                    QStandardItem *item = new QStandardItem(r.value(Fname).toString());
                    item->setFlags ( Qt::ItemIsEnabled );
                    item->setToolTip ("["+RowPositionString+"] - (ID:"+DBid+") - " + r.value(Fname).toString() + " - FieldName" + Fname );
                    if (x == 0) {
                        if (level == 4) {
                        item->setIcon ( QIcon(QString::fromUtf8(":/img/cassa_movimento.png")) );  
                        } else {
                        item->setIcon ( QIcon(QString::fromUtf8(":/img/info.png")) );
                        }
                        
                        
                    }
                    
                    diritto.append(item);
    }
    
    if (!OnBox(rowposition)) {    /* nicht 2 mal nehmen die gleiche position */
       RowUnique.insert(rowposition,level); 
    }
    
    if (childs > 0 ) {
        for (int i = 0; i < childs; ++i) {
        const int jumpto = i + 1 + rowposition;
          if (!OnBox(jumpto)) {  
              diritto.first()->appendRow(Compose(jumpto));
          }
        }
    }
return diritto;
}


/* die model zum qui tree QTreeWidget  bringen */

    cat_tree->setModel(model);
    cat_tree->expandAll();
    for (int e = 0; e < DisplayFields.size(); ++e) {
    cat_tree->resizeColumnToContents(e);  
    }
    cat_tree->hideColumn(DisplayFields.size() - 1); 
    cat_tree->setEditTriggers(QAbstractItemView::NoEditTriggers);
    cat_tree->setSortingEnabled(false);
    cat_tree->setSelectionBehavior(QAbstractItemView::SelectRows);
    cat_tree->setSelectionMode(QAbstractItemView::NoSelection);
    cat_tree->setAlternatingRowColors(true);
    connect(cat_tree, SIGNAL(activated(QModelIndex)), this, SLOT(ActiveTre(QModelIndex)));
    connect(cat_tree, SIGNAL(clicked(QModelIndex) ), this , SLOT(ActiveTre(QModelIndex) ));  


/* das signal nehmen */
void Classe::ActiveTre( QModelIndex index )
{
    if (!index.isValid()) {
    return;
    }
     /* model index zugreifen auf row column xx dieser line....*/
}

/* doppelte pruefen somit die gleiche row nicht doppel ist ! */
bool classe::OnBox( int rowposition )
{
   bool having = false;
   QMapIterator <int,int> i(RowUnique);
     while (i.hasNext()) {
           i.next();
           if ( rowposition == i.key()) {
            having = true;   
           }
    }
return having;
//// RowUnique.insert(int,int);   CheckRow RowUnique;  typedef QMap<int,int> CheckRow;
}



Naturlich geht es auch mit xml aber wenn 10 user zugreifen muessen gleichzeitig .. liber eine datenbank.....

Verfasst: 30. Dezember 2007 11:32
von upsala
@patrik08: Was hat das mit der Frage zu tun?

Code: Alles auswählen

connect( treeWidget, SIGNAL( itemDoubleClicked( QTreeWidgetItem *, int ) ), this, SLOT( showSetup2() ) );
Warum verwirfst du die Übergabeparameter, wenn du sie dann doch haben willst? Beschäftige dich bitte mit Signal/Slot-Grundlagen...

Verfasst: 30. Dezember 2007 12:13
von gboelter
upsala hat geschrieben:

Code: Alles auswählen

connect( treeWidget, SIGNAL( itemDoubleClicked( QTreeWidgetItem *, int ) ), this, SLOT( showSetup2() ) );
Warum verwirfst du die Übergabeparameter, wenn du sie dann doch haben willst? Beschäftige dich bitte mit Signal/Slot-Grundlagen...
Genau das ist ja meine Frage, welchen Parameter nehme fuer diesen Zweck. QTreeWidgetItem hat ja genuegend zur Auswahl, nur sind die fuer meinen Gechmack alle nicht sonderlich toll dokumentiert; zumindest nicht fuer einen Anfaenger.

Hab's mit "QTreeWidgetItem * QTreeWidget::currentItem () const" versucht, aber der scheint's nicht zu sein, oder?

Verfasst: 30. Dezember 2007 18:00
von patrik08
wenn man ein model hat kann man darauf zugreifen und das leben ist viel einfacher....

Code: Alles auswählen

connect(cat_tree, SIGNAL(clicked(QModelIndex) ), this , SLOT(ActiveTre(QModelIndex) ));  
QModelIndex hat alle informationen die mann will, zum editieren oder bearbeiten...

QAbstractItemModel * QTreeWidget::model () const das selbe im QListWidget

QTreeWidgetItem gibt info nur von einer zelle!
QModelIndex kann die ganze zeile lesen ...