QML TableView 使用 QtQuick.Controls 2 单击行

2023-12-08

我在网上搜索了很多,但没有找到答案,这真的很奇怪,因为我认为这是大多数人应该使用的基本功能(可能我不明白如何正确使用表格视图 with QtQuick.Controls 2).

问题是:我想知道我单击了哪一行,并且我想访问该行的特定列的数据(类似于 TableView.get(row, column))。在QtQuick.Controls 1.4有一些函数允许我访问行(像这个)但我找不到任何QtQuick.Control 2。还有就是没有选择: and 项目委托:那会有用的。如何实现这些东西QtQuick.Controls 2?

我正在使用 Qt 5.15.0 和 MinGw。我将数据库中的数据传递给 QMLQA抽象表模型.

.cpp模型

#include "archiviosqlmodel.h"
#include <QSqlRecord>
#include <QSqlError>
#include <QSqlQuery>
#include <QDebug>

ArchivioSqlModel::ArchivioSqlModel(QObject *parent) :
    QAbstractTableModel(parent)
{
    db_4= QSqlDatabase::addDatabase(QStringLiteral("QSQLITE"), "def.db");
        db_4.setDatabaseName("def.db");
    if (!db_4.isOpen())
        db_4.open();

    QSqlQuery query(db_4);
    query.exec("CREATE TABLE IF NOT EXISTS A (ID INTEGER PRIMARY KEY AUTOINCREMENT, B INTEGER, C CHAR(5), D CHAR(5), E CHAR(5));");
    query.exec("INSERT INTO A (ID, B, C, D, E) VALUES (1, 2, 'AAAAA', 'BBBBB', 'CCCCC')");
    query.exec("INSERT INTO A (ID, B, C, D, E) VALUES (2, 4, 'DDDDD', 'FFFFF', 'QQQQQ')");
    query.exec("INSERT INTO A (ID, B, C, D, E) VALUES (3, 5, 'EEEEE', 'GGGGG', 'HHHHH')");


    model.setQuery("SELECT * FROM A", db_4);

    qDebug() << "Row Count " << model.rowCount() << "Column count " << model.columnCount();
}

ArchivioSqlModel::~ArchivioSqlModel()
{
    db_4.close();
}

QVariant ArchivioSqlModel::headerData(int section, Qt::Orientation orientation, int role) const
{
    if(role == Qt::DisplayRole)
    {
        if(orientation == Qt::Horizontal)
        {
            switch (section)
            {
            case 0:
                return tr("ID");
            case 1:
                return tr("A");
            case 2:
                return tr("A");
            case 3:
                return tr("A");
            case 4:
                return tr("A");
            }
        }
    }
    return QVariant();
}

int ArchivioSqlModel::rowCount(const QModelIndex &parent) const
{
    if (parent.isValid())
        return 0;
    return model.rowCount();
}

int ArchivioSqlModel::columnCount(const QModelIndex &parent) const
{
    if (parent.isValid())
        return 0;
    return model.columnCount();
}

QVariant ArchivioSqlModel::data(const QModelIndex &index, int role) const
{
    QVariant value;
    if (!index.isValid())
        return QVariant();
    if(role == Qt::DisplayRole && index.row() >= 0 && index.row() < rowCount()
            && index.column() >= 0 && index.column() < columnCount())
    {
        QModelIndex modelIndex = this->index(index.row(), index.column());
        value = model.data(modelIndex, Qt::DisplayRole);
        return value;//QString("data %1-%2").arg(index.row()).arg(index.column());
    }
    return QVariant();
}

.h model

    #include <QSqlQueryModel>


class ArchivioSqlModel : public QAbstractTableModel
{
    Q_OBJECT

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

    Q_INVOKABLE QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;
    int rowCount(const QModelIndex &parent = QModelIndex()) const override;
    int columnCount(const QModelIndex &parent = QModelIndex()) const override;
    QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
    ~ArchivioSqlModel() override;

signals:
    void queryStrChanged();

public slots:

private:
    const static char* COLUMN_NAMES[];
    const static char* SQL_SELECT;

    QSqlDatabase db_4;
    QSqlQueryModel model;

    QHash<int, QByteArray> m_roleNames;

};

main.qml

 import QtQuick 2.12
import QtQuick.Window 2.12
import QtQuick.Controls 2.4
import Archive 1.0
Window {
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")
    Rectangle {
        id: rectangle
        x: 62
        y: 106
        width: 200
        height: 200
        color: "#000022"
        border.width: 0
        anchors.fill:parent

        Rectangle {
            id: rectangleBack
            x: 10
            y: 406
            width: 64
            height: 64
            color: "#000033"
            radius: 20
            anchors.left: parent.left
            anchors.leftMargin: 10
            anchors.bottom: parent.bottom
            anchors.bottomMargin: 10
            border.width: 2
            border.color: "#ffffff"

            MouseArea {
                id: mouseAreaBack
                anchors.fill: parent
                onClicked: {
                    if (stackView.depth > 1)
                        stackView.pop()
                }
                onPressed: {
                    rectangleBack.width = 64 - 4
                    rectangleBack.height = 64 - 4
                }
                onReleased: {
                    rectangleBack.width = 64
                    rectangleBack.height = 64
                }
            }
        }

        Text {
            id: textArchive
            height: 25
            color: "#ffffff"
            text: qsTr("Datas:")
            font.family: "Arial"
            verticalAlignment: Text.AlignVCenter
            font.bold: true
            fontSizeMode: Text.Fit
            horizontalAlignment: Text.AlignHCenter
            anchors.right: parent.right
            anchors.rightMargin: 0
            anchors.left: parent.left
            anchors.leftMargin: 0
            anchors.top: parent.top
            anchors.topMargin: 10
            font.pixelSize: 14
        }

        ArchivioSqlModel {
            id: archiviomodel
        }

        Rectangle {
            id: rectangle1
            color: "#000022"
            radius: 10
            border.width: 2
            border.color: "#ffffff"
            anchors.right: parent.right
            anchors.rightMargin: 5
            anchors.left: parent.left
            anchors.leftMargin: 5
            anchors.bottom: rectangleBack.top
            anchors.bottomMargin: 10
            anchors.top: textArchive.bottom
            anchors.topMargin: 10

            TableView {
                id: tableViewid
                anchors.leftMargin: 5
                anchors.bottomMargin: 5
                anchors.rightMargin: 5
                anchors.topMargin: 5

                columnWidthProvider: function (column) { return 100; }
                rowHeightProvider: function (column) { return 60; }
                anchors.fill: parent
                topMargin: columnsHeader.implicitHeight



                model: archiviomodel
                ScrollBar.horizontal: ScrollBar{}
                ScrollBar.vertical: ScrollBar{}
                clip: true



                delegate: Rectangle {
                    Text {
                        id: textId
                        text: display
                        anchors.fill: parent
                        anchors.margins: 10
                        color: 'black'
                        font.pixelSize: 15
                        verticalAlignment: Text.AlignVCenter
                    }

                    MouseArea {
                        anchors.fill: parent
                        onClicked: {
                            console.log("prova:" + textId.text)
                        }
                    }
                }


                Rectangle { // mask the headers
                    z: 3
                    color: "#000033"
                    y: tableViewid.contentY
                    x: tableViewid.contentX
                    width: tableViewid.leftMargin
                    height: tableViewid.topMargin
                }

                Row {
                    id: columnsHeader
                    y: tableViewid.contentY
                    z: 2
                    Repeater {
                        model: tableViewid.columns > 0 ? tableViewid.columns : 1
                        Label {
                            width: tableViewid.columnWidthProvider(modelData)
                            height: 35
                            text: archiviomodel.headerData(modelData, Qt.Horizontal)
                            color: '#ffffff'
                            font.pixelSize: 15
                            padding: 10
                            verticalAlignment: Text.AlignVCenter

                            background: Rectangle {
                                radius: 10
                                color: "#000022"
                            }
                        }
                    }
                }

                ScrollIndicator.horizontal: ScrollIndicator { }
                ScrollIndicator.vertical: ScrollIndicator { }

            }
        }

        Rectangle {
            id: rectangleOpenlap
            x: 10
            y: 406
            width: 64
            height: 64
            color: "#000033"
            radius: 20
            anchors.right: parent.right
            anchors.rightMargin: 10
            anchors.bottom: parent.bottom
            anchors.bottomMargin: 10
            border.width: 2
            border.color: "#ffffff"

            MouseArea {
                id: mouseAreaOpenlap
                anchors.fill: parent
                onClicked: {
                    console.log("Rows")
                }
                onPressed: {
                    rectangleOpenlap.width = 64 - 4
                    rectangleOpenlap.height = 64 - 4
                }
                onReleased: {
                    rectangleOpenlap.width = 64
                    rectangleOpenlap.height = 64
                }
            }
        }
    }
}

main.cpp

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include "archiviosqlmodel.h"

int main(int argc, char *argv[])
{
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);

    QGuiApplication app(argc, argv);

    qmlRegisterType<ArchivioSqlModel>("Archive", 1, 0, "ArchivioSqlModel");

    QQmlApplicationEngine engine;
    const QUrl url(QStringLiteral("qrc:/main.qml"));
    QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,
                     &app, [url](QObject *obj, const QUrl &objUrl) {
        if (!obj && url == objUrl)
            QCoreApplication::exit(-1);
    }, Qt::QueuedConnection);
    engine.load(url);

    return app.exec();
}

提前致谢!


要从模型访问数据,您可以使用模型上下文属性和内置显示角色:

MouseArea {
    anchors.fill: parent
    onClicked: {
        console.log(model.display)
    }
}

模型数据可以是set以类似的方式。

上面的内容基本上是以下内容的更简短的方式:

MouseArea {
    anchors.fill: parent
    onClicked: {
        console.log(row, column, tableViewid.model.data(tableViewid.model.index(row, column)))
    }
}

上面的代码使用index()创建一个索引,然后可以将其传递给data()

行和列属性提供给每个delegate.

如果您出于某种原因需要从委托外部从模型获取数据,这也很有用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QML TableView 使用 QtQuick.Controls 2 单击行 的相关文章

  • 与 MinGW 的静态和动态/共享链接

    我想从一个简单的链接用法开始来解释我的问题 假设有一个图书馆z它可以编译为共享库 libz dll D libs z shared libz dll 或静态库 libz a D libs z static libz a 让我想要链接它 然后
  • 如何使用不同的基本路径托管 Blazor WebAssembly 应用程序

    我有一个 Blazor Webassemble NET 托管应用程序 在我们托管它的服务器上 应用程序的基本路径将是mydomain com coolapp 因此 为了尝试让应用程序在服务器上正确呈现 我一直遵循本页 应用程序基本路径 部分
  • 来自 double 的 static_cast 可以优化分配给 double 吗?

    我偶然发现了一个我认为不必要的功能 并且通常让我感到害怕 float coerceToFloat double x volatile float y static cast
  • 如何在 C++ 中为指针“this”赋值

    在函数中 如何分配this一个新的价值 您可以分配对象this点于 this XY 但你不能分配直接值this this XY Error Expression is not assignable
  • 维护 VS Test Project 中单元测试方法之间的上下文

    我想按顺序运行以下单元测试 使用随机数字的名称 密码等创建新客户 检索刚刚创建的客户并断言其属性包含相同的随机数 对同一用户调用 ForgotPassword 函数 并使用相同的随机数作为用户名 清楚地看到 我需要生成一次随机数 并在 3
  • 大量互斥体对性能的影响

    假设我有一个包含 1 000 000 个元素的数组 以及多个工作线程 每个线程都操作该数组中的数据 工作线程可能会使用新数据更新已填充的元素 但每个操作仅限于单个数组元素 并且独立于任何其他元素的值 使用单个互斥锁来保护整个数组显然会导致高
  • 重载算术运算符

    赋值运算符可以声明为 T 运算符 const t 在类中 但不能以这种方式定义算术运算符 它必须是友元函数 我不明白为什么 你能解释一下吗 算术运算符不必须是友元 那么你可以这样定义 MyClass MyClass operator con
  • 注入包含接口的所有已注册实现的 Enumerable

    给出以下接口 public interface IMyProcessor void Process 我希望能够注册多个实现 并让我的 DI 容器将它们的可枚举注入到这样的类中 public class MyProcessorLibrary
  • 如何在 C++ 中正确使用 cin.fail()

    我正在编写一个程序 从用户那里获取整数输入cin gt gt iUserSel 如果用户输入一个字母 程序就会进入无限循环 我试图用下面的代码来阻止这种情况 但程序进入无限循环并打印出 错误 输入 我该如何修复我的程序 cin gt gt
  • 当我尝试传递临时地址作为参数时,它是一个 UB 吗?

    对于以下 C 代码 include
  • 更改私有模块片段是否会导致模块重新编译?

    On 此页面有关 C 20 模块功能 https www modernescpp com index php c 20 modules private module fragment and header units 我发现了这样的说法 借
  • C# 可以为控制台应用程序部分类“程序”类吗?

    我想知道是否可以将为任何控制台应用程序创建的默认 程序 类更改为部分类 我想这样做是因为我想要更好的组织 而不是将所有方法都放在按区域分类的 1 个文件中 对我来说 将某些方法类别放在单独的文件中会更有意义 我对分部类的理解是 它是多个文件
  • 运行实体框架自定义工具,它有什么作用?

    在 Visual Studio 中 当使用实体框架并为 tt 和 Context tt 文件应用运行自定义工具时 它是什么以及它有什么作用 为什么它解决数据库同步问题 有时 为什么我应该在运行 tt 之前运行它 Context tt 它被称
  • 如何在Windows窗体中打开进程

    我想在我的 Windows 窗体应用程序中打开进程 例如 我希望当用户按下 Windows 窗体容器之一中的按钮时 mstsc exe 将打开 如果他按下按钮 它将在另一个容器上打开 IE DllImport user32 dll SetL
  • 在 Visual Studio 2012 Express 中设置 C++ 调试环境

    我需要调试的应用程序需要设置环境变量 这在 Visual Studio 2012 中似乎非常复杂 我想做类似的事情 set path c foo c bar c windows c program files application set
  • g++ / gcc 是否支持 C++20 新的atomic_flag 功能?

    根据参考参数 https en cppreference com w cpp atomic atomic flag c 20 有丰富的 对我来说有用的 支持atomic flag运营 然而 目前尚不清楚 gcc 是否支持这些功能 它们在任何
  • 使用未命名命名空间而不是静态命名空间

    我可以假设在未命名命名空间中声明的对象相当于static namespace int x 1 static int x 2 FWIK 在这两种情况下 x将具有静态存储期限和内部链接 声明为的对象的所有规则也是如此static适用于未命名名称
  • 为什么我可以在另一个函数中定义一个函数?

    请参阅下面的代码 我在另一个函数中定义了一个函数 void test1 void void test2 void printf test2 n printf test1 n int main void test1 return 0 这个用法
  • 使用通用存储库模式和流畅的 nHibernate

    我目前正在开发一个中型应用程序 它将访问不同站点上的 2 个或更多 SQL 数据库等 我正在考虑使用类似的东西 http mikehadlow blogspot com 2008 03 using irepository pattern w
  • 将同步 zip 操作转换为异步

    我们有一个现有的库 其中一些方法需要转换为异步方法 但是我不确定如何使用以下方法执行此操作 错误处理已被删除 该方法的目的是压缩文件并将其保存到磁盘 请注意 zip 类不公开任何异步方法 public static bool ZipAndS

随机推荐

  • 无需 GUI 即可运行 Electron

    我看到这个问题已被询问但该问题的上下文不同 因此没有与我的用例相关的答案 因此我提出一个新问题 我有一个基于 Electron 的 Web 服务器 它适用于不习惯命令行的网络开发新手 学生和艺术家 是的 这是一个很大的争论 但我被加州大学洛
  • 为什么我的应用程序无法在 Xcode 8 beta (8S128d) 中运行

    这是一个会影响许多应用程序的问题 可以在 Xcode 8 beta 8S128d 中找到 这是第一个 Beta 版 尽管它没有标记为 beta 1 问题出在 NSUserDefaults 上 它不起作用 这是代码 也许可以将其放入appli
  • Python:(显式)字符串参数会损害性能吗?

    假设某个函数总是获取一些它不使用的参数 def someFunc s do something not using s for example a 1 现在考虑这个电话 someFunc the unused string 它给出一个字符串
  • DbNull.Value 和 DbNull.Value.ToString() 之间的区别

    我想知道哪种用法是正确的 if string IsNullOrEmpty parentID cmd Parameters Add new SqlParameter ParentSesID parentID else cmd Paramete
  • 将用于生成电子邮件的 PHP 脚本转换为使用表单中的变量行

    我正在使用 PHP 脚本根据表单中的信息生成电子邮件 该表单的行数可变 我已将表单中每行的输入名称转换为数组 方法是添加 名称后 以便所有行中的数据都可用于生成电子邮件 但是 我不知道该怎么做是如何构建 PHP 以便它可以生成一封电子邮件
  • WinForms 文本框中的按钮

    WinForms 文本框是否具有任何可以在框末尾嵌入按钮的属性 就像 Chrome 地址框上的收藏夹按钮一样 我还在某些 Excel 表单中看到类似以下内容 EDIT 我按照 Hans Passant 的回答添加了一个点击事件处理程序 它似
  • 多个处理程序附加到一个事件:如何仅分离一个?

    在我正在处理的这个模块中 我有一个监听窗口中 调整大小 事件的监听器 每次运行模块时 我都需要检查是否已经有一个侦听器注册到该事件并将其分离 以避免出现不需要的行为 内存泄漏等 到目前为止一切顺利 但是 在我们正在开发的这个应用程序中 有可
  • Rails 多列上的唯一索引失败(sqlite3)

    我使用 Rails 设置了一个 HATBM 模型 其中包含一个用户表 一个组表和一个用于连接的 groups users 所有这些都使用scaffold 命令 现在我想添加一个迁移 以在表 groups users 的 group id 和
  • 为什么IDIV为-1会导致浮点异常?

    据我了解 idiv ebx将分裂edx eax 按顺序连接成 64 位值 与 32 位ebx 然而 当我尝试划分时0x00000000 0xfffffffb 0 和 5 与0xffffffff 1 我得到一个浮点异常 有人可以解释为什么吗
  • 将 PHP/MySQL 数据拆分为 3 列

    我需要使用从 MySQL 返回的数据在 PHP 中创建 3 个 HTML 列 我希望数据在所有 3 列之间均匀分配 我将如何做到这一点 你可以尝试做这样的事情 result mysql query SELECT value FROM tab
  • 查找行 NA 的数据框中的唯一性?

    我有一个如下所示的数据框 我想找到唯一的行 唯一性 但在这个数据中我有 NA 我喜欢如果一行中具有 NA 值的所有值与其他行相同 如行 1 2 5 我想忽略它 但如果不相同 如行 2 4 我喜欢保留它作为唯一行 例如 在第 1 2 和 6
  • 使用 JQuery 逐个字母淡入淡出

    我试图获取 all msg 的文本 并使用 hide 方法隐藏它 然后一次淡入一个字母 有一点延迟 这是我的代码 var all msg welcome msg function animate i all msg hide all msg
  • (Xcode 6 beta / Swift)performSegueWithIdentifier 在 segue 之前有延迟

    我刚刚第一次使用 Swift 和 Xcode 6 beta 学习 Ios 编程 我正在制作一个简单的测试应用程序 它应该调用 API 然后以编程方式转到不同的视图以显示检索到的信息 问题是segue 在我的委托方法中didReceiveAP
  • 当我“像 shell 脚本一样”运行 setuptools .egg 时,实际发生了什么?

    来自阅读本文档 我已经建立了一个关于命令内容的心理模型sh setuptools 0 6c11 py2 7 egg实际上确实如此 但它非常不完整 我仍然对某些方面感到困惑 我的思维模型是这样的 当发出这个命令时 egg 我认为它是一种巧妙处
  • jquery 的子字符串选择器?

    是否可以使用 jquery 仅选择字符串的一部分 例如我有一个文本 p Metuentes igitur idem latrones Lycaoniam magna parte campestrem p 所以现在如果用户搜索一个字符串 我希
  • C++17 静态内联成员的编译器错误

    我正在使用 Microsoft Visual Studio 2017 据我所知 它确实支持 C 17 静态内联类变量 我的问题是 如果我将所有成员保留为统一状态 它可以正常工作 但在初始化某些成员时会出现编译器错误 在以下示例中 inclu
  • 动态添加侦听器到 ajax 在 jQuery 中创建的内容

    我正在尝试获取单击的链接的 html 值 这些链接是使用 Ajax 动态创建的 所以我认为 bind 不会 工作 但我没有最新版本的 live div message click function var valueSelected thi
  • JIT编译和DEP

    我正在考虑尝试一些 jit 编译 只是为了学习 并且让它跨平台工作会很好 因为我在家运行所有主要的三个 windows os x linux 考虑到这一点 我想知道是否有任何方法可以摆脱使用虚拟内存窗口函数来分配具有执行权限的内存 如果只使
  • 关于静态持有者单例模式

    我根据挥发性 惰性单例 急切单例 普通单例以及通过枚举等条件以多种方式开发了单例 但具体来说我想了解如下所示的静态持有者模式单例 public static class Singleton private static class Inst
  • QML TableView 使用 QtQuick.Controls 2 单击行

    我在网上搜索了很多 但没有找到答案 这真的很奇怪 因为我认为这是大多数人应该使用的基本功能 可能我不明白如何正确使用表格视图 with QtQuick Controls 2 问题是 我想知道我单击了哪一行 并且我想访问该行的特定列的数据 类