首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >QML TableView从特定单元格(选定的行+特定列)获取数据

QML TableView从特定单元格(选定的行+特定列)获取数据
EN

Stack Overflow用户
提问于 2015-10-05 19:12:13
回答 1查看 9.2K关注 0票数 4

我有QML TableViewQSqlQueryModel。我需要选择任何行,并从表的每一列中获取数据,以分离TextField

这是一个很稳定的地方。

代码语言:javascript
运行
复制
#pragma once

#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());
    QVariant data(const QModelIndex &index, int role) const;
    QHash<int, QByteArray> roleNames() const { return m_roleNames; }

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

abonentstable.cpp:

代码语言:javascript
运行
复制
#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::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;
}

Table.qml:

代码语言:javascript
运行
复制
TableView {
    id: table

    model: abonents

    ....

    TableViewColumn {
        delegate: Text {
            text: " " + model.name + " " + model.surname
            font.pointSize: 20
        }    
        width: 575
    }

    TableViewColumn {
        delegate: Text {
            text: " " + model.phone
            font.pointSize: 20
        }    
        width: 575
    }

    TableViewColumn {
        delegate: Text {
            text: " " + model.ip_address
            font.pointSize: 20
        }    
        width: 525
    }
}

和一些文本字段:

代码语言:javascript
运行
复制
TextField {
    id:  leftText
}

TextField {
     id:  centerText
}

TextField {
    id:  rightText
}

这个sqlite表有4列,我需要从选定的行获取数据到这些文本字段:左2列,中间1列,右1列。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-06 08:37:17

当用户单击有效行时,将发出clicked(int row)信号。然后,您可以获取该row的值,根据您的需求格式化文本,并在三个TextField中设置值。例如,在您的例子中:

代码语言:javascript
运行
复制
TableView {
    id: table

    model: abonents

    ... (your TableViewColumn components) ...    

    onClicked: {
        leftText.text = abonents.get(row).name + " " + libraryModel.get(row).surname;
        centerText.text = abonents.get(row).phone;
        rightText.text = abonents.get(row).ip_address;
    }
}

请允许我用我的own answer向您展示一个完整的示例:

代码语言:javascript
运行
复制
import QtQuick 2.2
import QtQuick.Window 2.2
import QtQuick.Controls 1.4

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

    TableView {
        y: 70
        width: 500

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

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

        onClicked: {
            leftText.text = libraryModel.get(row).title + " " + libraryModel.get(row).author;
            centerText.text = libraryModel.get(row).title;
            rightText.text = libraryModel.get(row).author;
        }

        model: libraryModel

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

    TextField {
        id:  leftText
    }

    TextField {
        id:  centerText
        anchors.left: leftText.right
    }

    TextField {
        id:  rightText
        anchors.left: centerText.right
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32956108

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档