gpt4 book ai didi

qt - TableView一列显示多个角色

转载 作者:行者123 更新时间:2023-12-04 18:02:35 26 4
gpt4 key购买 nike

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

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 中的唯一列。

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

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

数据库连接.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;
}

主要.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();
}

最佳答案

我认为您可以使用 delegate 连接这两个值组件。

在你的情况下:

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 example .

main.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"
}
}
}

}

关于qt - TableView一列显示多个角色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32682420/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com