Moja QTreeWidget
ma pojedynczą kolumnę. Jego elementy mają pole wyboru, ikonę i tekst. Jeśli użytkownik kliknie w element, chcę się dowiedzieć, czy kliknięto ikonę. Jak mogę znaleźć położenie i rozmiar ikony w QTreeWidgetItem
?Pozycja ikony w QTreeWidgetItem
Zaktualizowano, aby dodać: Oto kod dla mojego ewentualnego rozwiązania, zgodnie z żądaniem użytkownika webclectic.
Po pierwsze, podklasyfikowałem QItemDelegate
, aby uzyskać dostęp do współrzędnych każdej części QTreeWidgetItem
(pole wyboru, ikona i tekst). Oto nagłówek pliku:
#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 ;
} ;
I tu jest plik źródłowy:
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()) ;
}
Potem dodał członek MyItemDelegate*
do MyTreeWidget
i ustawić go jako delegata widoku elementu. W nagłówku:
class MyTreeWidget : public QTreeWidget
{
...
MyItemDelegate* Delegate ;
...
} ;
w źródle:
MyTreeWidget::MyTreeWidget (QObject* parent)
{
...
Delegate = new MyItemDelegate (this) ;
setItemDelegate (ItemDelegate) ;
}
Teraz, aby uzyskać współrzędne każdej części QTreeWidgetItem
:
QTreeWidgetItem* item ;
...
QModelIndex ModelIndex = indexFromItem (item) ;
QRect CheckBoxRect, IconRect, TextRect ;
ItemDelegate -> GetRects (ModelIndex, &CheckBoxRect, &IconRect, &TextRect) ;
Próbowałem tego, a to z 'PM_IndicatorWidth' działa dobrze. Dziękuję za to! Ponadto, 'iconSize()' zwraca (-1, -1), ale jeśli zadzwonię 'setIconSize()' najpierw działa. Wygląda to koliście, ale w rzeczywistości rozwiązał mój problem z ikonami, które są mniejsze niż chciałem. – TonyK
Dobrze wiedzieć .. :) – pnezis
Po kilku testach odkryłem, że to rozwiązanie również nie działa - ignoruje marginesy wokół pola wyboru i ikony. Aby zrobić to poprawnie, musiałem podklasy QItemDelegate i dostarczyć wersję sizeHint, która zwraca trzy części (pole wyboru, ikona, tekst) oddzielnie. Ale postawiłeś mnie na właściwej drodze. – TonyK