QML中如何快速显示qt中的动态模型



我有一个模型,它显示了从几个表中进行的一些选择。这是我的模态.h代码:

Q_PROPERTY(QStringList userRoleNames READ userRoleNames CONSTANT)

public:
QHash<int, QByteArray> roleNames() const;
QVariant data(const QModelIndex &index, int role) const;
QString queryStr() const;
void setQueryStr(const QString &query1);
QStringList userRoleNames() const;
//=====================================
//         QUERYs
//=====================================
void listAllCars();
void listPersonel(int opid);
Q_INVOKABLE void listStayCars(int opid);

这是我的cpp代码:

QHash<int, QByteArray> DynamicModel::roleNames() const
{
QHash<int, QByteArray> roles;
for (int i = 0; i < record().count(); i ++) {
roles.insert(Qt::UserRole + i + 1, record().fieldName(i).toUtf8());
}
return roles;
}
QVariant DynamicModel::data(const QModelIndex &index, int role) const
{
QVariant value;
if (index.isValid()) {
if (role < Qt::UserRole) {
value = QSqlQueryModel::data(index, role);
} else {
int columnIdx = role - Qt::UserRole - 1;
QModelIndex modelIndex = this->index(index.row(), columnIdx);
value = QSqlQueryModel::data(modelIndex, Qt::DisplayRole);
}
}
return value;
}

void DynamicModel::setQueryStr(const QString &query1){
//    if(queryStr() == query)
//        return;
//    setQuery(query);
this->setQuery(query1,QSqlDatabase::database("MainDB"));
qDebug()<<query().lastQuery();
qDebug()<<query().lastError();
qDebug()<<this->rowCount();
emit queryStrChanged();
}
QStringList DynamicModel::userRoleNames() const {
QStringList names;
for (int i = 0; i < record().count(); i ++) {
names << record().fieldName(i).toUtf8();
}
return names;
}
void DynamicModel::listAllCars()
{
QString str;
str.append("SELECT * from IORecord where Date1=date('now');");
this->setQuery(str,QSqlDatabase::database("MainDB"));
setQueryStr(str);
qDebug()<<query().lastQuery();
qDebug()<<query().lastError();
qDebug()<<this->rowCount();
}
void DynamicModel::listPersonel(int opid)
{
QString str;
str.append("SELECT * from Personel");
str.append(" ;");
this->setQuery(str,QSqlDatabase::database("MainDB"));
qDebug()<<query().lastQuery();
qDebug()<<query().lastError();
qDebug()<<this->rowCount();
}
void DynamicModel::listStayCars(int opid)
{
QString str;
str.append("SELECT Date1 ,EnterTime,Date2 ,ExitTime,CalculateFee ,AcceptedFee ,Description  "
"from IORecord where UserID=");
str.append(QString::number(opid));
str.append(" ;");
this->setQuery(str,QSqlDatabase::database("MainDB"));
qDebug()<<query().lastQuery();
qDebug()<<query().lastError();
qDebug()<<this->rowCount();
}  

我想向用户显示我需要的每个查询
我使用了这个QML:

Component{
id: lblComponent
Label{}
}
ListView{
id: view
property int id: 1
x:30
y:30
width: 500
height: 500
model: sqlmodel
delegate: Row {
id:myrow
spacing: 10
width: parent.width
height: 20
Component.onCompleted: {
var roleList = sqlmodel.userRoleNames
var temp = []
for(var i in roleList){
var role  = roleList[i]
var lbl = lblComponent.createObject(myrow,{ text : role});
//myrow.push(columnComponent.createObject(view, { "role": role, "title": role}))
}
}}

如何向用户显示此模型?如何在列表视图中显示这个动态模型?当我不知道应该使用多少标签时,如何定义委托?我只有角色名。

是的,这很难。

我的建议是去掉ListView,使用TableView(https://doc.qt.io/qt-5/qml-qtquick-tableview.html)相反。

这样,您就有了可变数量的列(字段,您在查询中请求这些字段(和可变数量的行(记录(。

您的基本ListView是非常可配置的,这是真的,但当您只在运行时确定要显示哪些字段,或者更重要的是,确定要显示多少字段时,它就达到了极限。

在键入时考虑一下,您可以在C++代码中定义一个小部件类型,它负责显示记录,并将该类型公开给QML以作为ListView的委托创建。如果在执行DB请求时调用beginResetModel()endResetModel(),则会创建新的委托来显示新内容,因此可以使用查询的字段为委托配置公开的工厂函数。

我想,最简单的是TableView。如果你需要美观,你可能需要选择一个更复杂的版本,比如创建一个自定义的小部件类型。

最新更新