Il mio QTreeWidget
ha una singola colonna. I suoi elementi hanno una casella di controllo, un'icona e un testo. Se l'utente fa clic all'interno di un elemento, voglio sapere se l'icona è stata selezionata. Come posso trovare la posizione e la dimensione dell'icona in un QTreeWidgetItem
?Posizione dell'icona in QTreeWidgetItem
Aggiornamento aggiornato per aggiungere: Ecco il codice per la mia soluzione finale, come richiesto da webclectic.
In primo luogo, ho sottoclassificato QItemDelegate
in modo da poter accedere alle coordinate di ciascuna parte di un QTreeWidgetItem
(casella di controllo, icona e testo). Ecco il file di intestazione:
#include <QItemDelegate>
class MyItemDelegate : public QItemDelegate
{
Q_OBJECT
public:
explicit MyItemDelegate (MyTreeWidget *parent)
: QItemDelegate (parent), ParentView (parent) { }
~MyItemDelegate() { }
void GetRects (const QModelIndex &index, QRect& CheckBox, QRect& Icon, QRect& Text) const ;
private:
MyTreeWidget* ParentView ;
} ;
E qui è il file di origine:
void MyItemDelegate::GetRects (const QModelIndex &index, QRect& CheckBox, QRect& Icon, QRect& Text) const
{
QStyleOptionViewItem option = ParentView -> viewOptions() ;
CheckBox = rect (option, index, Qt::CheckStateRole) ;
Icon = rect (option, index, Qt::DecorationRole) ;
Text = rect (option, index, Qt::DisplayRole) ;
doLayout (option, &CheckBox, &Icon, &Text, true) ;
QRect VisualRect = ParentView -> visualRect (index) ;
CheckBox.translate (VisualRect.topLeft()) ;
Icon.translate (VisualRect.topLeft()) ;
Text.translate (VisualRect.topLeft()) ;
}
poi ho aggiunto un membro MyItemDelegate*
-MyTreeWidget
, e impostarlo come delegato della vista oggetto. Nell'intestazione:
class MyTreeWidget : public QTreeWidget
{
...
MyItemDelegate* Delegate ;
...
} ;
nella fonte:
MyTreeWidget::MyTreeWidget (QObject* parent)
{
...
Delegate = new MyItemDelegate (this) ;
setItemDelegate (ItemDelegate) ;
}
Ora, per ottenere le coordinate di ciascuna parte di un QTreeWidgetItem
:
QTreeWidgetItem* item ;
...
QModelIndex ModelIndex = indexFromItem (item) ;
QRect CheckBoxRect, IconRect, TextRect ;
ItemDelegate -> GetRects (ModelIndex, &CheckBoxRect, &IconRect, &TextRect) ;
Ho provato questo, e quella cosa con 'PM_IndicatorWidth' funziona bene. Grazie per quello! Inoltre, 'iconSize()' restituisce (-1, -1), ma se chiamo 'setIconSize()' prima funziona. Sembra circolare, ma in realtà ha risolto il mio problema con le icone più piccole di quanto volessi. – TonyK
Buono a sapersi .. :) – pnezis
Dopo alcuni test, ho scoperto che questa soluzione non funziona: ignora i margini attorno alla casella di controllo e all'icona. Per farlo correttamente, ho dovuto sottoclasse QItemDelegate e fornire una versione di sizeHint che restituisce le tre parti (casella di controllo, icona, testo) separatamente. Ma tu mi metti sulla buona strada. – TonyK