我想使用QListView與包含QSlider和QSpinBox小部件的自定義小部件。 我成功地創建了QListView,並使用新的自定義項目委託來顯示自定義窗口小部件,但鼠標事件並未傳播到自定義窗口小部件。QListView與自定義項目=>鼠標事件傳播
無法滑動QSlider或更改QSpinBox的值。用戶不能與項目交互。
我是Qt新手,我猜這是因爲自定義小部件不是列表視圖的子代。我試圖將窗口小部件關聯到列表視圖(在項目委託構造函數中),但這不起作用。
我也嘗試使用QWidget :: event()函數將item委託的事件傳播到窗口小部件,但這不起作用。
有沒有人有想法?
這是自定義窗口小部件:
這裏是而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 _「如果要顯示自定義動態內容或實現自定義編輯器小部件,請使用QListView和QItemDelegate的子類」,因此我使用了帶有委託的QListView。但是我必須實現工作原因,這是QListWidget所做的(我檢查了源代碼)。我不會僅顯示數十個數據。 – 2014-10-10 13:33:17