在 TableView 的一列中显示多个角色 [英] Display several roles in one column of TableView

查看:24
本文介绍了在 TableView 的一列中显示多个角色的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个带有 4 列的 SQLite 3 数据库和带有显示它的 TableView 的 QML 代码:

I have a SQLite 3 database with 4 columns and QML code with TableView that displays it:

TableView {
    id: table
    ...

    TableViewColumn {
        role: "name"            
        width: 275
    }
    TableViewColumn {
        role: "surname"
        width: 300
    }
    TableViewColumn {
        role: "phone"
        width: 575
    }
    TableViewColumn {
        role: "ip_address"
        width: 525
    }
    model: abonents
}

它工作正常,但我需要将前两个角色 namesurname 显示为 TableView 中的唯一列.

It works fine, but I need to display the first two roles, name and surname, as a unique column in TableView.

这是我的模型和 main 的代码.

Here is the code for my model and the main.

abonentstable.h:

abonentstable.h:

#ifndef ABONENTSTABLE
#define ABONENTSTABLE

#include <QObject>
#include <QSqlQueryModel>

class AbonentsSqlModel : public QSqlQueryModel
{
    Q_OBJECT

public:
    explicit AbonentsSqlModel(QObject *parent = 0);

    void setQuery(const QString &query, const QSqlDatabase &db = QSqlDatabase());
    void setQuery(const QSqlQuery &query);
    QVariant data(const QModelIndex &index, int role) const;
    QHash<int, QByteArray> roleNames() const { return m_roleNames; }

signals:

public slots:

private:
    void generateRoleNames();
    QHash<int, QByteArray> m_roleNames;
};

#endif // ABONENTSTABLE

dbconnection.cpp:

dbconnection.cpp:

#include "abonentstable.h"

#include <QSqlRecord>
#include <QSqlField>

AbonentsSqlModel::AbonentsSqlModel(QObject *parent) :
    QSqlQueryModel(parent)
{
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName("data_base.sqlite");
    db.open();
}

void AbonentsSqlModel::setQuery(const QString &query, const QSqlDatabase &db)
{
    QSqlQueryModel::setQuery(query, db);
    generateRoleNames();
}

void AbonentsSqlModel::setQuery(const QSqlQuery & query)
{
    QSqlQueryModel::setQuery(query);
    generateRoleNames();
}

void AbonentsSqlModel::generateRoleNames()
{
    m_roleNames.clear();
    for( int i = 0; i < record().count(); i ++) {
        m_roleNames.insert(Qt::UserRole + i + 1, record().fieldName(i).toUtf8());
    }
}

QVariant AbonentsSqlModel::data(const QModelIndex &index, int role) const
{
    QVariant value;

    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;
}

main.cpp:

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>
#include <QVariant>
#include <QSql>
#include <QSqlQueryModel>
#include <QObject>
#include "abonentstable.h"


int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);

    QQmlApplicationEngine engine;

    AbonentsSqlModel *abonentsSqlModel = new AbonentsSqlModel(0);
    abonentsSqlModel->setQuery("SELECT * FROM abonents");

    QQmlContext *context = engine.rootContext();
    context->setContextProperty("abonents", abonentsSqlModel);
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

    return app.exec();
}

推荐答案

我认为你可以使用 委托组件.

I think you could join both values using the delegate component.

在你的情况下:

TableView {
    id: table
    ...

    TableViewColumn {           
        width: 575
        delegate: Text { text: model.name + " "  + model.surname }
    }       
    TableViewColumn {
        role: "phone"
        width: 575
    }
    TableViewColumn {
        role: "ip_address"
        width: 525
    }
    model: abonents
}

这里有另一个例子,只是为了测试你是否想使用它.该示例基于此 Qt 示例.

Here you have another example, just for testing if you want to work with it. The example is based on this Qt example.

ma​​in.cpp

#include <QGuiApplication>
#include <QQmlApplicationEngine>

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);

    QQmlApplicationEngine engine;
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

    return app.exec();
}

ma​​in.qml

import QtQuick 2.2
import QtQuick.Window 2.2
import QtQuick.Controls 1.4

ApplicationWindow {
    id: window
    visible: true
    title: "Table View Example"

    TableView {
        TableViewColumn {
            role: "title"
            title: "Title"
            width: 100
        }
        TableViewColumn {
            role: "author"
            title: "Author"
            width: 100
        }

        TableViewColumn{
            width: 300
            delegate: Text { text: model.title + " "  + model.author }
        }

        TableViewColumn{
            width: 300
            delegate: Text {
                text: model.title + " "  + model.author
                font.family: "Courier New"
                font.pixelSize: 18
                color: "red"
            }
        }

        model: libraryModel

        ListModel {
            id: libraryModel
            ListElement {
                title: "A Masterpiece"
                author: "Gabriel"
            }
            ListElement {
                title: "Brilliance"
                author: "Jens"
            }
            ListElement {
                title: "Outstanding"
                author: "Frederik"
            }
        }
    }

}   

这篇关于在 TableView 的一列中显示多个角色的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆