我将纯虚方法QStyledItemDelegate::paint
定义为:
void FooViewDelegate::paint( QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index ) const
{
bool selected = option.state & QStyle::State_Selected;
// ...
// drawing code
}
但我无法知道如何知道绘图项是当前还是否(与QListView::currentIndex()
相同的项目)。
答案 0 :(得分:1)
Qt MVC不适用于此类用例,因为从理论上讲,代理不应该知道您使用的是哪种视图(可能是QListView
或QTableView
)。
因此,“好方法”是将此信息保存在您的委托中(因为模型可能由sevaral视图使用)。 Fox示例(伪代码):
class FooViewDelegate : ...
{
private:
QModelIndex _currentIndex;
void connectToView( QAbstractItemView *view )
{
connect( view, &QAbstractItemView::currentChanged, this, &FooViewDelegate ::onCurrentChanged );
}
void onCurrentChanged( const QModelIndex& current, const QModelIndex& prev )
{
_currentIndex = current;
}
public:
void paint( QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index ) const
{
bool selected = index == _currentIndex;
// ...
// drawing code
}
}
答案 1 :(得分:1)
委托的父级是视图,可以直接从视图中获取当前索引。
void FooViewDelegate::paint( QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index ) const
{
bool selected = index == parent()->currentIndex();
}
答案 2 :(得分:0)
你走在正确的轨道上:
auto current = option.state & QStyle::State_HasFocus;
具有焦点的项目是当前项目。