如何更新或读取 TabView 中的 GridLayout 内的文本字段

Posted

技术标签:

【中文标题】如何更新或读取 TabView 中的 GridLayout 内的文本字段【英文标题】:How to update or read TextFiled inside GridLayout which is in TabView 【发布时间】:2020-05-31 09:57:43 【问题描述】:

我有下面的组件堆栈,我想读取并设置 TextFiled 的值:

-Rectangle
-----TabView
---------Tab
-----------Rectangle 
--------------GridLayout
------------------Rectangle 
--------------------TextField <--- I want to access this TextField

我也有需要在 Tab 内访问 Repeater 的情况:

-Rectangle
-----TabView
---------Tab
-----------Rectangle 
--------------GridLayout
------------------Repeater 
--------------------TextField <--- I want to access this TextField also

我尝试使用以下方式访问它:

var tab0 = myTabView.getTab(0);
tab0.children[0].text = "Some Text"; // I get Undefined Error 

我尝试使用Tab 中的函数访问组件:

import QtQuick 2.0
import QtQuick.Controls 2.14 as QQC2
import QtQuick.Layouts 1.14
import QtQuick.Controls 1.4 as QQC1

QQC2.Item 

QQC1.TabView 

  QQC1.Tab 
    title: "tab1"

    function printValue ()  
      console.log("myTextFld.txt: "+myTextFld.txt);  // <-- Getting Error myTextFld undefined.
    

    Rectangle 
      id: tabHolderRext
      color: "blue"

      GridLayout 
        id: myGrid
        model: 7

        Repeater 
          id: herderRepeater
          model: header
          delegate: Rectangle 
            TextField 
              // I want to Access This TextField also 
            
          
        

        Rectangle 
          id: row0Rect
          Layout.row: 0
          Layout.column: index

          TextFiled 
            id: myTextFld
            text: modelData
               
        

        // Rest of the rows 
    
    




【问题讨论】:

旧的TabView 使用了一种延迟加载的概念。请改用TabBar 和StackLayout。 【参考方案1】:

如果您的所有项目都在同一个 qml 文件中,则项目 id 可用于访问 TextField 中的值。如果您有不同的 qml 文件,请使用 alias types link 来访问这些值。

Repeater 案例:Textfield 必须先更新底层模型view --&gt; model,然后我们才能使用模型的数据。

这是一个示例代码。我已将所有项目堆叠在同一个 qml 文件中,以便通过 id 进行访问。

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

Window 
    visible: true
    width: 640
    height: 480

    Item 
        anchors.fill: parent
        anchors.margins: 10

        TabView 
            anchors.fill: parent
            Tab 
                title: "TextField"

                Item 
                    anchors.fill: parent
                    Grid 
                        spacing: 20
                        anchors.fill: parent
                        anchors.margins: 10
                        Rectangle 
                            height: 40
                            width: 150
                            TextField 
                                id: inputId
                                anchors.fill: parent
                                placeholderText: "enter text"
                            
                        

                        Button 
                            height: 40
                            width: 150
                            text: "show txt"
                            onClicked: labelId.text = inputId.text
                        

                        Rectangle 
                            height: 40
                            width: 150
                            Label 
                                id: labelId
                                anchors.fill: parent
                                horizontalAlignment: Text.AlignHCenter
                                verticalAlignment: Text.AlignVCenter
                            
                        
                    
                
            
            Tab 
                title: "Repeater"

                Item 
                    anchors.fill: parent
                    Grid 
                        spacing: 20
                        anchors.fill: parent
                        anchors.margins: 10
                        columns: 3

                        ListModel 
                            id: fruitModel
                            ListElement  name: "Apple" 
                            ListElement  name: "Orange" 
                            ListElement  name: "Banana" 
                        

                        Repeater 
                            width: parent.width
                            height: parent.height / 2
                            model: fruitModel
                            delegate: Rectangle 
                                height: 40
                                width: 150
                                TextField 
                                    anchors.fill: parent
                                    text: name
                                    onTextChanged: fruitModel.setProperty(index, "name", text) // update model data
                                
                            
                        

                        Repeater 
                            width: parent.width
                            height: parent.height / 2
                            model: fruitModel
                            delegate: Rectangle 
                                height: 40
                                width: 150
                                Label 
                                    text: name
                                    anchors.fill: parent
                                    horizontalAlignment: Text.AlignHCenter
                                    verticalAlignment: Text.AlignVCenter
                                
                            
                        
                    
                
            
        
    


【讨论】:

以上是关于如何更新或读取 TabView 中的 GridLayout 内的文本字段的主要内容,如果未能解决你的问题,请参考以下文章

如何在窗口中重绘 Qt 窗口或 tabview

SwiftUI TabView 不更新视图

如何在tabview中的更改选项卡中实现转换?

如何从 SQL Server 读取 MS Access 数据库以更新一个或多个表列中的数据?

UWP TabView OneWay x:绑定不更新

自定义tabview标题栏