gpt4 book ai didi

c++ - 在 Qt View 中使用 QWidget

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:24:26 25 4
gpt4 key购买 nike

问题:我有一个简单的 QStringListModel,我想在 View 中显示它。但是,我希望 View 中的每个项目都是我创建的自定义 QWidget。我不明白为什么这是一个如此困难的问题!我在互联网上搜索了解决方案,虽然我在这里和那里找到了一些零碎的东西,但没有一个好的解决方案能满足我的所有需求。

设置我的模型/ View 的基本代码:


QStringList strings;
// add some strings to the model

QStringListModel* model = new QStringListModel(strings);
QListView* view = new QListView;

view->setModel(model);

我尝试过各种尝试,但都无济于事。

尝试#1

我尝试子类化一个新的 QItemDelegate 对象。在这个对象中,我覆盖了创建编辑器的方法。我遵循了设置该代表的所有步骤。问题是,当 View 填充模型时,当我需要它来获取 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 对象添加到 ListView 中的每一行而言,这很有效。为了确保常规模型数据不会也显示在我的 CustomWidget 对象下方,我还覆盖了 CustomListView::paintEvent(QPaintEvent* event) 以不执行任何操作。再次,这奏效了。

但我现在的主要问题是,当显示列表时,虽然我的 CustomWidgets 正确显示在上面,但列表的背景是纯白色。我尝试在 CustomListView 上调用 setAutoFillBackground(false) 但没有任何作用。我希望我的 ListView 具有透明背景。

对此问题的任何反馈都将非常感激。我花了很多时间试图让它工作!谢谢!

最佳答案

我认为我在 QStandardItemModel 中呈现自定义数据时遇到了类似的问题。我为解决它所做的是创建一个自定义 QStyledItemDelegate。在createEditor方法中,可以测试:

if( qVariantCanConvert<YourObject>(index.data(Qt::YourRole)) )

然后创建您的编辑器,它实际上是您想要的自定义小部件。并使用模型中的数据设置其值。为了自定义我的小部件,我使用了样式表,例如 CustomWidget.setStylesheet("background: blue");

在委托(delegate)的 paint 方法中,如果您想要与编辑器完全相同的小部件。

CustomWidget renderer;
renderer.setText( index.data(Qt::DisplayRole).toString() );
renderer.resize(option.rect.size());
painter->save();
painter->translate(option.rect.topLeft());
renderer.render(painter);
painter->restore();

您必须自己处理 openPersistentEditor 和 closePersistentEditor。

希望对您有所帮助。

关于c++ - 在 Qt View 中使用 QWidget,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5184956/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com