我最近拿起的Qt一遍,并开始刷新我的记忆中。 创建一个表自定义数据模型是很容易的。
现在,我想检索所选数据。 注意,我使用自定义的数据对象。
我的自定义模型的例子:
platform.h
class Platform
{
public:
Platform();
Platform(QString name);
QString getName();
void setName(QString name);
private:
QString m_name;
};
非常简单的数据结构,用于测试目的。 然后,我实现了一个QAbstractTableModel,数据()方法是这样的:
platformmodel.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(平台);
是的它的工作原理,它能够将其存储在一个的QVariant,问题是,由于显示,字符串总是预期,或者反正9/10倍。 到目前为止,似乎不可能有两个文本显示,并从选择模型的全平台目标(i可以单独做到既..没什么用了..)