我想将QListView与包含QSlider和QSpinBox小部件的自定义小部件一起使用。我成功创建了带有新的自定义项目委托的QListView,该委托显示了自定义小部件,但鼠标事件未传播到自定义小部件。
无法滑动QSlider或更改QSpinBox的值。用户无法与这些项目进行交互。
我是Qt的新手,我想这是因为自定义小部件不是列表视图的子级。我试图将小部件关联到列表视图(在项目委托构造函数中),但这不起作用。
我还尝试使用QWidget :: event()函数将项目委托的事件传播到小部件,但这不起作用。
有人有想法吗?
这里是自定义小部件:
这里是显示自定义窗口小部件的QListView:
这是我的自定义项目委托的代码:
#include <QPainter>
#include "layeritemwidgetdelegate.h"
#include "../../libs/debug/debug.h"
LayerItemWidgetDelegate::LayerItemWidgetDelegate( QObject *ptParent ) :
QItemDelegate( ptParent ),
m_ptItemWidget( new LayerItemWidget() )
{
}
LayerItemWidgetDelegate::~LayerItemWidgetDelegate()
{
delete m_ptItemWidget;
}
void LayerItemWidgetDelegate::paint( QPainter *ptPainter, const QStyleOptionViewItem &tOption, const QModelIndex &tIndex ) const
{
QPalette tPalette;
// Resize the item widget
m_ptItemWidget->resize( tOption.rect.size() );
// Change the background color of the widget if it is selected.
if( QStyle::State_Selected == ( tOption.state & QStyle::State_Selected ) )
tPalette.setBrush( QPalette::Window, QBrush( QColor( Qt::lightGray ) ) );
else
tPalette.setBrush( QPalette::Window, QBrush( QColor( Qt::transparent ) ) );
m_ptItemWidget->setPalette( tPalette );
// Paint the widget
ptPainter->save();
ptPainter->translate( tOption.rect.topLeft() );
m_ptItemWidget->render( ptPainter );
ptPainter->restore();
}
QSize LayerItemWidgetDelegate::sizeHint(const QStyleOptionViewItem &tOption, const QModelIndex &tIndex) const
{
Q_UNUSED( tOption )
Q_UNUSED( tIndex )
return QSize( m_ptItemWidget->minimumWidth(), m_ptItemWidget->height() );
}
bool LayerItemWidgetDelegate::editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index)
{
m_ptItemWidget->propagateEvent(event);
m_ptItemWidget->setEnabled( true );
DEBUG_MESSAGE( "EVENT" );
}
您应该阅读有关setItemWidget
方法的文档。您可以将窗口小部件设置为仅显示一些数据,而不能与该窗口小部件进行交互。
可能的解决方法(应如何完成,但此任务需要大量调整):
QPixmap::grabWidget
并缓存您的小部件视图)QModelIndex
-然后为该项目创建一个编辑器。但是在您的情况下,我相信您应该考虑重新设计您的想法(如果您不需要太多物品的话:
注:项目视图窗口小部件旨在显示大量数据,而并非进行复杂的交互。