2017-06-02 672 views
0

我有一個QListView我想要顯示一個簡單的小部件與進度條和一些其他領域(和一些上下文菜單,也許,但目前我只是想顯示小部件)。該列表中有一個模型,模型成功地將一個字符串傳遞給列表,並且沒有委託的情況下一切正常。C + + Qt:QStyledItemDelegate的createEditor從來沒有被調用,雖然paint()被調用

現在與代表,createEditor()方法是從來沒有調用。我不明白爲什麼。我不需要繪畫,但我只是覆蓋paint()sizeHint()以查看它們是否被調用,而且它們是。

我在QListView上看到的基本上是簡單的文本項目。小部件永遠不會顯示(當然,因爲createEditor()從不被調用)。

以下是我的代表...很基本!

class FileQueueItemDelegate : public QStyledItemDelegate 
{ 
    Q_OBJECT 
public: 
    FileQueueItemDelegate(QObject *parent = 0); 
    QWidget* createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const override; 
    void setEditorData(QWidget *editor, const QModelIndex &index) const override; 
    void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const override; 
    void updateEditorGeometry(QWidget *editor, 
           const QStyleOptionViewItem &option, 
           const QModelIndex &index) const override; 
    void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const; 
    QSize sizeHint(const QStyleOptionViewItem &option, 
        const QModelIndex &index) const override; 
}; 

和源(也相當基本的和最小):

#include "FileQueueItemDelegate.h" 

FileQueueItemDelegate::FileQueueItemDelegate(QObject *parent) : QStyledItemDelegate(parent) 
{ 

} 

QWidget *FileQueueItemDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const 
{ 
    std::cout<<"Creating editor..."<<std::endl; 
    FileQueueListItem* item = new FileQueueListItem(parent); 
    return item; 
} 

void FileQueueItemDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const 
{ 
    std::cout<<"Setting editor data..."<<std::endl; 
    FileQueueListItem* editorPtr = dynamic_cast<FileQueueListItem*>(editor); 
    QVariant dataResult = index.model()->data(index, Qt::DisplayRole); 
    editorPtr->setFilename(dataResult.toString()); 
} 

void FileQueueItemDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const 
{ 
    std::cout<<"Setting model data..."<<std::endl; 
} 

void FileQueueItemDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const 
{ 
    std::cout<<"Updating editor geometry..."<<std::endl; 
    editor->setGeometry(option.rect); 
} 

void FileQueueItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const 
{ 
    std::cout<<"Painting..."<<std::endl; 
    QStyledItemDelegate::paint(painter, option, index); 
} 

QSize FileQueueItemDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const 
{ 
    std::cout<<"Size hint..."<<std::endl; 
    return QStyledItemDelegate::sizeHint(option, index); 
} 

我能看到的paint()sizeHint()的版畫,而不是其他人(永遠)。

以下是我QListView類的構造函數(我繼承了它從它):

FilesQueueQList::FilesQueueQList(FilesQueue* queueObjectPtr) 
{ 
    this->internal_queue = queueObjectPtr; 
    this->setModel(internal_queue); 
    itemDelegate = new FileQueueItemDelegate(this); 
    this->setItemDelegate(itemDelegate); 
} 

而下面是它的定義:

class FilesQueueQList : public QListView 
{ 
    Q_OBJECT 
    FilesQueue* internal_queue; //this inherits from QAbstractListModel 
    FileQueueItemDelegate* itemDelegate; 

//... 
} 

最後,這是data()方法在型號中:

QVariant FilesQueue::data(const QModelIndex &index, int role) const 
{ 
    std::cout<<"Loading data of "<<index.row()<< " "<<index.column()<<std::endl; 
    if (role == Qt::DisplayRole) { 
     return filesQueue[index.row()]->getFilename(); 
    } 
    if(role == Qt::EditRole) { 
     return filesQueue[index.row()]->getFilename(); //QString this is 
    } 
    return QVariant(); 
} 

請協助。讓我知道你是否需要更多信息。我一直在努力一整天才能讓這個工作沒有成功。我只需要將該小部件(FileQueueListItem)顯示在列表中。

+0

'createEditor'成員僅在觸發編輯視圖中的項目時發生。什麼是與你的視圖相關聯的[編輯觸發器](http://doc.qt.io/qt-5/qabstractitemview.html#editTriggers-prop)? –

+0

@ G.M。在那裏的答案幫助,然而,仍然有一部分失蹤。你還能看看嗎? –

回答

1

您尚未實施FilesQueue::flags(const QModelIndex &index) const。 默認實現使單元格僅啓用和可選。

參見documentation

+0

你是對的!謝謝你的提示。但是,只有在雙擊item元素才能「更改」該小部件時,該小部件纔會顯示出來。即使它發生了變化,它仍然保留了最初的列表項目(這只是文本)。任何想法? –

相關問題