Qt 具有自定义项的QListView=>;传播鼠标事件

Qt 具有自定义项的QListView=>;传播鼠标事件,qt,listview,qitemdelegate,Qt,Listview,Qitemdelegate,我想将QListView与包含QSlider和QSpinBox小部件的自定义小部件一起使用。 我成功地使用一个新的自定义项委托创建了QListView,该委托显示自定义小部件,但鼠标事件不会传播到自定义小部件 无法滑动QSlider或更改QSpinBox的值。用户无法与项目交互 我不熟悉Qt,我想这是因为自定义小部件不是列表视图的子项。我尝试将小部件与列表视图(在item delegate构造函数中)关联,但这不起作用 我还尝试使用QWidget::event()函数将项委托的事件传播到小部件,

我想将QListView与包含QSlider和QSpinBox小部件的自定义小部件一起使用。 我成功地使用一个新的自定义项委托创建了QListView,该委托显示自定义小部件,但鼠标事件不会传播到自定义小部件

无法滑动QSlider或更改QSpinBox的值。用户无法与项目交互

我不熟悉Qt,我想这是因为自定义小部件不是列表视图的子项。我尝试将小部件与列表视图(在item delegate构造函数中)关联,但这不起作用

我还尝试使用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" );
}
#包括
#包括“layeritemwidgetdelegate.h”
#包括“../../libs/debug/debug.h”
LayerItemWidgetDelegate::LayerItemWidgetDelegate(QObject*ptParent):
Qitem代表(家长),
m_optItemWidget(新的LayerItemWidget())
{
}
LayerItemWidgetDelegate::~LayerItemWidgetDelegate()
{
删除m_ptItemWidget;
}
void LayerItemWidgetDelegate::绘制(qPaint*ptPainter,常量QStyleOptionViewItem&Topion,常量QModelIndex&tIndex)常量
{
QPalette-tPalette;
//调整项目小部件的大小
m_optItemWidget->resize(tOption.rect.size());
//如果选择了小部件,请更改其背景色。
if(QStyle::State_Selected==(tOption.State&QStyle::State_Selected))
tPalette.setBrush(QPalette::Window,QBrush(QColor(Qt::浅灰色));
其他的
tPalette.setBrush(QPalette::Window,QBrush(QColor(Qt::transparent));
m_optItemWidget->setPalette(Tpalete);
//绘制小部件
ptPainter->save();
ptPainter->translate(tOption.rect.topLeft());
m_ptItemWidget->render(ptPainter);
ptPainter->restore();
}
QSize LayerItemWidgetDelegate::sizeHint(常数QStyleOptionViewItem&Topion,常数QModelIndex&tIndex)常数
{
Q_未使用(顶部)
Q_未使用(tIndex)
返回QSize(m_optItemWidget->minimumWidth(),m_optItemWidget->height());
}
bool LayerItemWidgetDelegate::editorEvent(QEvent*事件,QAbstractItemModel*模型,常量QStyleOptionViewItem&option,常量QModelIndex&索引)
{
m_optItemWidget->传播事件(事件);
m_ptItemWidget->setEnabled(true);
调试消息(“事件”);
}

您应该阅读有关
setItemWidget
方法的文档。您可以将小部件设置为仅显示一些数据,而不是与此小部件交互

可能的解决方法(应如何完成,但此任务需要大量调整):

  • 实现一个将绘制必要控件的委托(或使用
    QPixmap::grabWidget
    并缓存小部件视图)
  • 跟踪鼠标事件
  • 当鼠标悬停在某个
    QModelIndex
    -上时,为该项目创建一个编辑器
  • 跟踪编辑器事件,并在鼠标离开时隐藏编辑器并提交数据
  • 但在你的情况下,我认为你应该考虑重新设计你的想法(如果你没有太多的项目):

  • 使用垂直布局创建您自己的小部件
  • 将您的小部件放在那里
  • 处理模型事件(…利润!)

  • 备注:项目视图小部件旨在显示大量数据,而不是用于进行复杂的交互。

    我使用了QListView和委托,因为有关于setItemWidget的文档“如果要显示自定义动态内容或实现自定义编辑器小部件,请改用QListView和子类QItemDelegate。”。但是我必须实现workdaroung,因为这是QListWidget所做的(我已经检查了源代码)。我不会显示数百个数据,只会显示十几个。