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

Alles rund um die Programmierung mit Qt
Antworten
gboelter
Beiträge: 80
Registriert: 5. Dezember 2007 14:52
Wohnort: Davao City, Philippines

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

Beitrag 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.
Zuletzt geändert von gboelter am 31. Dezember 2007 10:59, insgesamt 1-mal geändert.
Guenther
Davao City, Philippines, Planet Earth, 28°C

Qt 4.8.1 for Linux/X11 - Open Source Edition for Application Development
patrik08
Beiträge: 746
Registriert: 27. Februar 2006 10:48
Wohnort: DE Freiburg

Beitrag 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.....
.........................
speack português italiano deutsch english castellà qt
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag 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...
gboelter
Beiträge: 80
Registriert: 5. Dezember 2007 14:52
Wohnort: Davao City, Philippines

Beitrag 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?
Guenther
Davao City, Philippines, Planet Earth, 28°C

Qt 4.8.1 for Linux/X11 - Open Source Edition for Application Development
patrik08
Beiträge: 746
Registriert: 27. Februar 2006 10:48
Wohnort: DE Freiburg

Beitrag 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 ...
.........................
speack português italiano deutsch english castellà qt
Antworten