2009-06-30 1 views
1

Ich habe ein Treewidget in meiner Qt Form. Es zeigt einen Baum von Dateien, der ein Symbol zeigt, das etwas über sie darstellt, und ihren Namen.Icon klick auf Qt QTreeWidget

Ich eingegeben diese mit treeItem->setIcon(0, *icon) und treeItem->setText(0, text).

Der Grund, warum ich beide Werte in derselben Spalte (0) eingegeben habe, ist, weil sonst die Icons nicht neben dem Text bleiben würden, sondern immer links bleiben, auch wenn der Text nach rechts eingerückt ist (weil es ist ein Kind eines anderen Gegenstandes).

Das Problem ist, jetzt kann ich nicht sagen, ob der Benutzer auf das Symbol oder auf den Text selbst geklickt hat, und ich muss mit diesen separat beschäftigen.

So ist es trotzdem weitere Informationen zu bekommen als nur die TreeItem und Spalte, wenn ein Objekt in einem treewidget geklickt wird, oder ist es eine Möglichkeit, sie auf separate Spalten zu setzen und haben immer noch die normalen Verhalten Symbole und Text sollte haben?

Danke.

Antwort

1

Ich glaube nicht, dass es eine direkte Möglichkeit gibt, mehr Informationen zu erhalten, wenn Sie einfach die clicked() - oder itemClicked() - Signale verwenden. Sie müssen wahrscheinlich eine benutzerdefinierte Klasse erstellen, die QTreeWidget erbt, und eine der virtuellen Mausereignisfunktionen neu implementieren.

mouseMoveEvent (QMouseEvent *) 
mousePressEvent (QMouseEvent *) 
mouseReleaseEvent (QMouseEvent *) 

Das ist nicht etwas, was ich empfehlen würde, wenn Sie wirklich wissen, was Sie tun, und wirklich brauchen, es zu tun.

Ich kann mich jedoch nicht erinnern, ein Listenwidget irgendwo gesehen zu haben, wo das Klicken auf ein Icon anders gehandhabt wird als auf den Text in derselben Spalte. Wenn Sie also nach "dem normalen Verhalten suchen, das Symbole und Text haben sollten", sollten Sie wahrscheinlich nach einer anderen Lösung suchen.

0

fand ich die folgende Lösung für dieses Problem:

void MyTreeWidget::mousePressEvent(QMouseEvent* aEvent) 
{ 
    QTreeWidget::mousePressEvent(aEvent); 

    const QPoint clickedPosition = aEvent->pos(); 
    const QRect itemRectangle  = visualItemRect(itemAt(clickedPosition)); 
    const int iconOffset   = itemRectangle.height() - iconSize().height(); 

    QRect iconRectangle; 
    iconRectangle.setTopLeft(itemRectangle.topLeft() + QPoint(iconOffset, iconOffset)); 
    iconRectangle.setWidth(iconSize().width()); 
    iconRectangle.setHeight(iconSize().height()); 

    if (iconRectangle.contains(clickedPosition)) 
    { 
     qDebug() << "ICON clicked"; 
     // Emit an icon clicked SIGNAL. 
    } 
}