C++ C++;Qt:QStyledItemDelegate';虽然调用了paint(),但从不调用createEditor
我有一个C++ C++;Qt:QStyledItemDelegate';虽然调用了paint(),但从不调用createEditor,c++,qt,model-view-controller,qt5,qitemdelegate,C++,Qt,Model View Controller,Qt5,Qitemdelegate,我有一个QListView,我想在其中显示一个简单的小部件,带有进度条和一些其他字段(可能还有一些上下文菜单,但目前我只想显示小部件)。列表下面有一个模型,模型成功地向列表传递了一个字符串,没有委托,一切都正常工作 现在,对于委托,永远不会调用createEditor()方法。我不明白为什么。我不需要绘制,但我只需要覆盖paint()和sizeHint()以查看它们是否被调用,它们是否被调用 我在QListView上看到的基本上是简单的文本项。小部件从未显示(当然,因为从未调用createEdi
QListView
,我想在其中显示一个简单的小部件,带有进度条和一些其他字段(可能还有一些上下文菜单,但目前我只想显示小部件)。列表下面有一个模型,模型成功地向列表传递了一个字符串,没有委托,一切都正常工作
现在,对于委托,永远不会调用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;
};
来源(也是非常基本和最少的):
其定义如下:
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();
}
qvariantfilesqueue::data(常量QModelIndex&index,int角色)常量
{
std::cout您尚未实现FilesQueue::flags(const QModelIndex&index)const
。
默认实现仅使单元格处于启用和可选择状态
请参阅。您尚未实现FilesQueue::flags(const QModelIndex&index)const
。
默认实现仅使单元格处于启用和可选择状态
请参阅。只有当视图中的某个项目发生触发编辑时才会调用createEditor
成员。与您的视图关联的是什么?@G.M。下面的答案很有帮助,但是仍然缺少一个部分。您是否也可以查看一下?只有在出现问题时才会调用createEditor
成员ppens触发对视图中某个项目的编辑。与您的视图相关联的是什么?@G.M.下面的答案很有帮助,但是,那里仍然缺少一部分。您也可以查看一下吗?您是对的!谢谢您的提示。但是,小部件只有在我双击项目元素以“更改”它时才会显示进入该小部件。即使它更改,它仍然保留初始列表项(即仅文本)。知道吗?你是对的!谢谢你的提示。但是,小部件直到我双击item元素使其“更改”为该小部件时才显示。即使它更改,它仍然保留初始列表项(即仅文本).有什么想法吗?
class FilesQueueQList : public QListView
{
Q_OBJECT
FilesQueue* internal_queue; //this inherits from QAbstractListModel
FileQueueItemDelegate* itemDelegate;
//...
}
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();
}