Qt MVC 模式和 std::string

Qt MVC Pattern and std::string

我关于 Qt MVC 模式和 std::string 类型中的模型的问题。 例如,我有一个从其他库生成的结构对象(例如增强):

struct Foo{
   int age;
   std::string name;
}

和QAbstractListModel数据实现

QVariant FooListModel::data(const QModelIndex &index, int role) const
{
    if (index.row() < 0 || index.row() > fooList.count())
        return QVariant();
    const Foo & foo = contacts[fooList.row()];
    if (role == AgeRole)       //AgeRole = 0
        return foo.age;
    else if (role == NameRole) //NameRole = 1
        return QString::fromStdString(foo.name);
    return QVariant();
}

问题是名称数据不起作用。现在我只看到一个解决方案——将所有 Foo class 对象转换为 FooQt 对象:

struct FooQt{
   int age;
   QString name;
}

有没有更干净的解决方案?

问题出在您对 Qt 的视图模型的使用上。角色描述单个项目的不同方面,如显示的文本、字体、颜色、装饰等。

您的 AgeRole(即 0)等于 Qt::DisplayRole。这就是为什么年龄似乎起作用的原因。您的 NameRole(即 1)等于 Qt::DecorationRole。您将使用它来指定图标或背景颜色。

您可能想要为模型的不同列提供数据:

QVariant FooListModel::data(const QModelIndex &index, int role) const
{
    // Only provide data for valid indices and display role
    if (index.row() < 0 || index.row() >= fooList.count() || role != Qt::DisplayRole)
        return QVariant();
    const Foo & foo = contacts[index.row()];
    // Check which column to display
    if (index.column() == AgeRole)       //AgeRole = 0
        return foo.age;
    else if (index.column() == NameRole) //NameRole = 1
        return QString::fromStdString(foo.name);
    return QVariant();
}