使用委托在Listview中绘制QWidgets

时间:2016-03-30 16:44:16

标签: qt

我正在寻找有关如何在每行中使用自定义内容实现列表视图的一些建议。我已经使用QLIstWidget完全实现了我想要的东西,但是QListwidget"吃掉了#34;我传递给它的任何小部件,我都不想要这种行为。此外,这个列表可能是"长"而且我不想分配100个小部件。

最容易描述我想要完成的事情的是查看我的委托绘画功能。对于这个问题,这只是一个简单的例子。

void CustomItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option,
const QModelIndex &index) const
{

    qDebug() << "Painting something" << endl;
    if(index.data().canConvert<CustomModelItem>())
    {
        CustomModellItem item = qvariant_cast<CustmomModelItem>(index.data());
        QApplication::style()->drawControl(QStyle::CE_ItemViewItem, &option, painter, item.getItem());
    }
    else
    {
        qDebug() << "Delegate...something broken 2" << endl;
        QStyledItemDelegate::paint(painter, option, index);

    }
}

CustomModelItem只不过是一个将指针保存为自定义小部件的包装器结构。

我意识到我可以手动绘制控件,因为它只不过是标签和图标的集合,但我想绘制具有样式表中定义的属性的项目。任何建议将不胜感激。

1 个答案:

答案 0 :(得分:1)

如果委托中的'小部件'只是图标和标签,我会说最简单和最强大的方法是使用样式系统在您的自定义委托中使用QPainter手动绘制它们。

在项目视图中使用真实小部件非常复杂,因为没有规定在列表视图中控制它们的生命周期。您需要维护小部件的一些数据结构,并在paint()中手动定位它们,然后绘制它们。如果没有一些事件过滤器来转发事件,事件处理也将无效。我不会说这种方法不可能,但这是一项大量的工作,可能会有错误。

请注意,您可以定义编辑器窗口小部件并在创建编辑器时更改,例如在行上的任何鼠标按下时。这可以让您使用小部件与行进行交互,但对绘画没有帮助。