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();
}
我关于 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();
}