Mi QTreeWidget
tiene una sola columna. Sus elementos tienen una casilla de verificación, un icono y texto. Si el usuario hace clic dentro de un elemento, quiero saber si se hizo clic en el icono. ¿Cómo puedo encontrar la posición y el tamaño del icono en un QTreeWidgetItem
?Posición del icono en QTreeWidgetItem
Actualizado para añadir: Aquí está el código para mi solución final, tal como lo solicitó webclectic.
Primero, clasifiqué QItemDelegate
para poder acceder a las coordenadas de cada parte de un QTreeWidgetItem
(casilla de verificación, icono y texto). Aquí está el archivo de cabecera:
#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 ;
} ;
Y aquí está el archivo de origen:
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()) ;
}
Luego añade un miembro MyItemDelegate*
-MyTreeWidget
, y configurarlo como delegado de la vista del elemento. En el encabezado:
class MyTreeWidget : public QTreeWidget
{
...
MyItemDelegate* Delegate ;
...
} ;
en la fuente:
MyTreeWidget::MyTreeWidget (QObject* parent)
{
...
Delegate = new MyItemDelegate (this) ;
setItemDelegate (ItemDelegate) ;
}
Ahora, para obtener las coordenadas de cada parte de un QTreeWidgetItem
:
QTreeWidgetItem* item ;
...
QModelIndex ModelIndex = indexFromItem (item) ;
QRect CheckBoxRect, IconRect, TextRect ;
ItemDelegate -> GetRects (ModelIndex, &CheckBoxRect, &IconRect, &TextRect) ;
Probé esto, y esa cosa con 'PM_IndicatorWidth' funciona bien. ¡Gracias por eso! Además, 'iconSize()' devuelve (-1, -1), pero si llamo 'setIconSize()' primero, funciona. Parece circular, pero de hecho resolvió mi problema con los íconos que eran más pequeños de lo que quería. – TonyK
Es bueno saber ... :) – pnezis
Después de algunas pruebas, descubrí que esta solución tampoco funciona: ignora los márgenes alrededor de la casilla de verificación y el ícono. Para hacerlo correctamente, tuve que subclasificar QItemDelegate y proporcionar una versión de sizeHint que devuelve las tres partes (casilla de verificación, icono, texto) por separado. Pero me pusiste en el camino correcto. – TonyK