【发布时间】:2011-11-25 20:55:40
【问题描述】:
我的QTreeWidget 有一个列。它的项目有一个复选框、一个图标和文本。如果用户在一个项目内单击,我想知道该图标是否被单击。如何在QTreeWidgetItem 中找到图标的位置和大小?
更新添加:这是我最终解决方案的代码,应 webclectic 的要求。
首先,我对QItemDelegate 进行了子分类,以便我可以访问QTreeWidgetItem(复选框、图标和文本)的每个部分的坐标。这是头文件:
#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 ;
} ;
这里是源文件:
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()) ;
}
然后我向MyTreeWidget 添加了一个MyItemDelegate* 成员,并将其设置为项目视图的委托。在标题中:
class MyTreeWidget : public QTreeWidget
{
...
MyItemDelegate* Delegate ;
...
} ;
在源码中:
MyTreeWidget::MyTreeWidget (QObject* parent)
{
...
Delegate = new MyItemDelegate (this) ;
setItemDelegate (ItemDelegate) ;
}
现在,获取QTreeWidgetItem的每个部分的坐标:
QTreeWidgetItem* item ;
...
QModelIndex ModelIndex = indexFromItem (item) ;
QRect CheckBoxRect, IconRect, TextRect ;
ItemDelegate -> GetRects (ModelIndex, &CheckBoxRect, &IconRect, &TextRect) ;
【问题讨论】:
标签: qt