问题:我想在视图中显示一个简单的QStringListModel。但是,我希望视图中的每个项目都是我创建的自定义QWidget。我不明白为什么这是一个很难的问题!我已经在互联网上寻找解决方案,尽管我在这里和那里发现了点点滴滴,但没有一个好的解决方案可以满足我的所有需求。在Qt视图中使用QWidget
设立我的模型/视图的基本代码:
QStringList strings;
// add some strings to the model
QStringListModel* model = new QStringListModel(strings);
QListView* view = new QListView;
view->setModel(model);
我已经在这样做无济于事尝试过各种尝试。
尝试#1
我试着子类新QItemDelegate对象。在这个对象中,我重写了创建编辑器的方法。我遵循了设置该代表的所有步骤。问题是,当模型填充视图时,当我需要抓取Qt :: EditRole中的每个项目时,它会抓取模型中的每个项目在Qt :: DisplayRole中。
尝试#2
我尝试的另一种方法是子类而QListView,并重写则setModel方法调用setIndexWidget对于模型中的每个项目。我的代码看起来是这样的:
void CustomListView::setModel(QAbstractItemModel* model)
{
QListView::setModel(model);
for (int i = 0; i rowCount(); ++i)
{
QModelIndex index = model->index(i, 0);
CustomWidget* widget = new CustomWidget;
setIndexWidget(index, widget);
}
}
这个工作,只要在列表视图中添加我CustomWidget对象的每一行。为了确保常规模型数据不会在我的CustomWidget对象下方显示,我也重写了CustomListView :: paintEvent(QPaintEvent * event),不做任何事情。再次,这工作。
但现在我的主要问题是,当列表显示时,虽然我的CustomWidgets正确显示,但列表的背景是纯白色。我试着在CustomListView上调用setAutoFillBackground(false),但是什么也没做。我希望我的列表视图具有透明背景。
对此问题的任何反馈意见将大大大大赞赏。我花了很多时间试图让这个工作!谢谢!
的涂料代码因此,关于尝试#2,我修复了背景问题。在我的CustomListView构造函数中,我调用了viewport() - > setAutoFillBackground(false)。我仍然喜欢这些方法或其他可能适用于这个问题的想法。 – Chris 2011-03-03 19:04:44
我认为你应该坚持代表。你也应该发布你的setEditorData()和setModelData()函数的源代码。 – zkunov 2011-03-03 19:43:38
不幸的是,我不能让我的列表中的所有项目都处于EditMode中,并使用委托中的createEditor()返回的QWidget。似乎一次只能有一个项目处于该模式。 – Chris 2011-03-03 21:14:53