2014-10-10 123 views
0

我想使用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"); 
} 

回答

0

您應該閱讀有關setItemWidget方法的文檔。您可以設置小部件來顯示一些數據,而不是與這些小部件進行交互。

可能的解決方法(它應該怎麼做,但這個任務需要進行大量的優化):

  1. 實現一個委託,它會吸取必要的控制(或使用QPixmap::grabWidget和緩存的小工具視圖)
  2. 跟蹤鼠標事件
  3. 當鼠標懸停一些QModelIndex - 然後創建該項目的編輯器。
  4. 軌道編輯器的事件,而當鼠標離開它 - 隱藏的編輯和提交數據

但在你的情況我beleive,你應該考慮重新設計你的想法(如果你還沒有到多少項目):

  1. 與垂直佈局
  2. 將您的小部件有
  3. 把手的事件(...的利潤!)
創建您自己的小工具

備註:項目視圖窗口小部件旨在顯示大量的數據,而且它們並非旨在執行復雜的交互。

+0

由於關於setItemWidget _「如果要顯示自定義動態內容或實現自定義編輯器小部件,請使用QListView和QItemDelegate的子類」,因此我使用了帶有委託的QListView。但是我必須實現工作原因,這是QListWidget所做的(我檢查了源代碼)。我不會僅顯示數十個數據。 – 2014-10-10 13:33:17