我最近再次拿起了Qt,并开始刷新我的记忆。为表创建自定义数据模型非常简单。
现在我正在尝试检索选定的数据。请注意,我使用自定义数据对象。
我的自定义模型示例:
平台.h
class Platform
{
public:
Platform();
Platform(QString name);
QString getName();
void setName(QString name);
private:
QString m_name;
};
用于测试目的的非常简单的数据结构。然后我实现了一个 QAbstractTableModel,Data() 方法如下所示:
平台模型.cpp
QVariant PlatformModel::data(const QModelIndex &index, int role) const
{
if (!index.isValid())
return QVariant();
if (index.row() >= m_platforms.size() || index.row() < 0)
return QVariant();
if (role == Qt::DisplayRole) {
Platform platform = m_platforms.at(index.row());
qDebug() << platform.getName();
return platform.getName();
}
return QVariant();
}
我从这段代码中了解到,对于可选择的项目,总是返回一个字符串,而不是一个平台对象。
为了显示,这很好用,我在视图中看到了实际的对象。现在我想从模型中选择实际的对象,而不仅仅是一个 QString。
所以方法体应该是这样的:
void MainWindow::selectionChangedSlot(const QItemSelection &, const QItemSelection &)
{
//get the text of the selected item
const QModelIndex index = ui->lvPlatforms->selectionModel()->currentIndex();
Platform selectedPlatform = index.data();//This returns a QVariant and will fail at compile time, but I want to achieve something along this line.
setWindowTitle(selectedPlatform.getName());
}
Ps 也许我试图搜索错误的东西,我可以找到使用自定义对象的示例,但没有人谈论检索所选项目。
必须有一种更好的方法,然后检索字符串,然后遍历平台列表并将名称与所选项目进行比较。如果我有一个大列表,则必须遍历每个项目并进行字符串比较不是很有效.
我希望我的问题足够清楚。如果缺少重要的东西,请告诉我,以便我可以编辑我的示例。
编辑
我试过 Q_DECLARE_METATYPE(Platform);
是的,它可以工作,它可以将它存储在 QVariant 中,问题是,因为为了显示,总是需要一个字符串,或者无论如何都要 9/10 次。到目前为止,似乎不可能同时显示文本并从选择模型中获取完整的平台对象(我可以单独做这两个.. 非常没用..)