QML中的tablview嵌入checkbox问题。



  • QML中tablview怎么实现选中某一行使第一列的CheckBox选中?全选怎么实现?怎么遍历出已选择的行号?



  • @我叫胡孟岳 可以找到currentIndex,然后让ListModel::get获取元素,然后设置checkbox的cheked为true。全选的话,加上for循环。遍历的话,选择行号的时候保存一下,下次遍历就方便了。也可以实现undo等功能。



  • 你说的我不是很明白,代码贴给你帮我看看吧,谢谢。

    TableView{
        id: tableView
        anchors{top: proProListTopImage.bottom; left: parent.left; right: parent.right; bottom: parent.bottom}
        backgroundVisible: false                        //背景不可见
        alternatingRowColors: false
        frameVisible:false
        model: modelProList
        verticalScrollBarPolicy: Qt.ScrollBarAlwaysOff
        horizontalScrollBarPolicy: Qt.ScrollBarAlwaysOff
    
    
    
        TableViewColumn
        {
            id: checkedColumn
            role: "checked"
            title: qsTr("选择");
            width: tableView.width * 0.2;
        }
    
        TableViewColumn{
            role: "name";
            title: qsTr("工厂编码");
            width: tableView.width * 0.4;
        }
    
        TableViewColumn{
            role: "value";
            title: qsTr("工厂名称");
            width: tableView.width * 0.4;
    
        }
    
        headerDelegate: Rectangle{
            color: "#414549"
            height: inventorypage.width * (60.0 / 640.0);
            Text{
                anchors.centerIn: parent
                text: styleData.value
                color: "white"
                font.pixelSize:  inventorypage.width * (45.0 / 640.0) * 0.7;
            }
        }
    
        itemDelegate: Item {
            CheckBox
            {
                id: checkbox;
                anchors.centerIn: parent
                visible: isCheckColumn( styleData.column );
                height: (93.0 / 640.0) * inventorypage.width;
                style: CheckBoxStyle {
                    indicator: Rectangle {
                        implicitWidth: inventorypage.width * (30.0 / 640.0);
                        implicitHeight: inventorypage.width * (30.0 / 640.0);
                        color:"#36393b";
                        radius: inventorypage.width * (15.0 / 640.0);
                        border.color:control.activeFocus ? "darkblue" : "lightblue";
                        border.width: 4;
    
                        Image{
                            id: checkStatus;
                            anchors.fill: parent;
                            visible: control.checked;
                            source: diffMonitorImagePath + "tick.png";
                        }
                    }
                }
            }
            Text
            {
                anchors{top: parent.top; topMargin: 0.3* height; right:parent.right}
                anchors{left: parent.left; leftMargin: 10}
                text: styleData.value;
                verticalAlignment: Text.AlignVCenter;
                horizontalAlignment: Text.AlignLeft;
                color: "white";
                anchors.centerIn: parent;
                height: (93.0 / 640.0) * inventorypage.width;
                font.pixelSize:  inventorypage.width * (32.0 / 640.0);
                elide: styleData.elideMode;
                wrapMode: Text.WrapAtWordBoundaryOrAnywhere;
            }
            MouseArea{
                id: mouseArgag
                anchors.fill: parent;
                onClicked: {
                    checkbox.checked = !checkbox.checked;
                }
            }
        }
    
        rowDelegate: Rectangle {
            id: rowRectdelete;
            height: (93.0 / 640.0) * inventorypage.width;
            color:"#36393b";
            Rectangle{
                height: 1;
                width: parent.width;
                anchors.bottom: parent.bottom;
                color: "#6a6a6a";
            }
        }
    }
    function isCheckColumn( columnIndex )
    {
        return tableView.getColumn( columnIndex ) === checkedColumn
    }
    

    我想实现随便点击tablview的某一行,该行第一列的checkbox状态为选中。



  • @我叫胡孟岳 首先我说说 TableView 的原理吧。不然会吃亏的。

    TableView,ListView,GridView,PathView,这些 View 会对视图进行优化,也就是当可见项(数据展示项)在看不到的地方就会销毁,这也是 View 为何可以显示无限个的数据展示项(硬盘为上限,每个数据展示项不能太大,一次能显示的数据展示项个数在合理范围)。

    先看看如下代码:

    ListView {
        model: 1000000 // 这里表示有一百万个数据
        delegate: Text {text: index}    // 显示数据
    }
    

    你会发现,如果真的要渲染一百万个 Text,机身内存是吃不消的,所以在显示上会做优化,也就是看不到的数据展示项,就不创建,当数据展示项超出视图时,就会被销毁。

    在看看如下代码:

    ListView {
        model: 1000000 // 这里表示有一百万个数据
        delegate: CheckBox { }
    }
    

    这里显示了一百万个 CheckBox,每个 CheckBox 都可以保存自己的被选中的状态 checkable。但是就如上面所说的,数据展示项在超出可见范围就会被销毁。也就是数据展示项本身如果保存了数据,在销毁前没有保存的话,就会丢失。

    所以解决的办法也很简单,另外构建一个数据,安装顺序保存这些 CheckBox 的状态值。

    具体项目代码可以查看 ImageExplorer/ImageExplorerPage.qml 第 89 行,以及第 139 行 143 行。

    由于相册显示使用了 GridView,如果每个图片展示项(数据展示项)都放一个 CheckBox 那么,数据展示项超出视图时,就会被销毁。也就不能保存你选择了哪些图片。所以构建一个 ListModel 或者数组保存这些数据即可。



  • 此回复已被删除!

 

最近的回复

  • 我在win10上跑起来居然报错,然后我就放弃了

    阅读更多
  • 大家好!最近应该很好吧。世界杯来了,有没有喝一杯呢?
    我很高兴地告诉大家,我们在上周末的时候完成了Live2D的改造,将我们的看板娘换了哦。原先是蕾姆。
    0_1529471654453_dfe4b40e-ad64-4b7a-9d58-5c48609ea3e2-image.png
    同时我对样式也做了一些微调,比如说这里:
    0_1529471386270_828e7fbb-fe0c-4f6b-bb52-03938ac7e19f-image.png
    看起来稍微好了一些。

    随后论坛进行升级了哦,升级到了最新1.9.2版本了,各种功能应该得到优化了吧。
    最后欢迎大家继续来玩~

    阅读更多
  • Qt for Python终于发布了!
    以前的我,可能接触了一点Python,但是都没有坚持下来,现在Python水平还很弱呢。不过我基本语法还是了解一点的。所以我打算借着Qt for Python的东风,来尝试一下Python的开发。

    1、去Python 官网安装Python。地址是:

    https://www.python.org/downloads/mac-osx
    0_1529422911935_1.png
    我下载的版本是3.6.5

    2、双击pkg安装包进行安装,按照提示安装即可,不必做什么设置。
    0_1529422932496_2.png
    3、安装pip。pip是一个类似npm的快速安装器,非常适合python安装。由于Mac的安全策略,这个时候要输入的命令以sudo开始:

    sudo python get-pip.py

    4、需要安装Qt官网提供的python安装包。Qt的Python安装包并没有放入Pypi的地址,因为Qt库本身就偏大。
    但是依然能够通过pip安装。只是安装的命令稍微长:

    sudo pip install --index-url=https://download.qt.io/official_releases/QtForPython/ pyside2

    然后输出的结果是:
    daxiongtekiMacBook-Air:~ jiangcaiyang$ sudo pip install --index-url=https://download.qt.io/official_releases/QtForPython/ pyside2
    Password:
    The directory '/Users/jiangcaiyang/Library/Caches/pip/http' or its parent directory is not owned by the current user and the cache has been disabled. Please check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag.
    The directory '/Users/jiangcaiyang/Library/Caches/pip' or its parent directory is not owned by the current user and caching wheels has been disabled. check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag.
    Looking in indexes: https://download.qt.io/official_releases/QtForPython/
    Collecting pyside2
    Downloading https://download.qt.io/official_releases/QtForPython/pyside2/PySide2-5.11.0-5.11.0-cp27-cp27m-macosx_10_11_intel.whl (125.7MB)
    100% |████████████████████████████████| 125.7MB 1.0MB/s
    matplotlib 1.3.1 requires nose, which is not installed.
    matplotlib 1.3.1 requires tornado, which is not installed.
    Installing collected packages: pyside2
    Successfully installed pyside2-5.11.0
    安装成功。

    5、安装成功了,开始写一个测试的程序吧!
    最简单的,当然是Hello Qt for Python啦。很简单,使用Qt Creator,很方便地可以创建这样的Python脚本,使用方法也和C++版本的Qt应用相同:

    #!/usr/bin/env python # -*- coding: utf-8 -*- from PySide2.QtWidgets import QApplication, QLabel app = QApplication( [ ] ) label = QLabel( "您好 Qt for Python!" ) label.show( ) app.exec_( )

    0_1529422962008_4.jpg
    其中第一行表示用/usr/bin/python 来解析,大家可以在命令提示符输入“which python”来看结果:
    第二行则是在Python 3.x下不用写了,设定的是utf-8编码格式。大家最好也是使用这样的格式,因为这样遇到编码的坑最少。
    因为Python没有main()函数的说法,所以直接从上往下运行就可以了。Python是弱语言,所以不用声明类型,这里还有一点不一样,就是
    app.exec_( ),和C++版本不同的是,添加上了一个下划线。可能和Python内置的函数冲突了?我还需要再调查一下。

    接下来我就仿照例子写了一个更加复杂的Python程序,大致是这样的:

    #!/usr/bin/env python # -*- coding: utf-8 -*- import sys import random from PySide2.QtCore import Qt from PySide2.QtWidgets import (QApplication, QWidget, QPushButton, QLabel, QVBoxLayout ) class MyWidget( QWidget ): def __init__( self ): QWidget.__init__( self ) self.hello = [ "Hallo welt!", "Ciao mondo", "Hei maailma", "Hola mundo", "Hei verden!" ] self.button = QPushButton( "Click me!" ) self.text = QLabel( "Hello World" ) self.text.setAlignment( Qt.AlignCenter ) self.layout = QVBoxLayout( ) self.layout.addWidget( self.text ) self.layout.addWidget( self.button ) self.setLayout( self.layout ) self.button.clicked.connect( self.magic ) def magic( self ): self.text.setText( random.choice( self.hello ) ) if __name__ == "__main__": app = QApplication( sys.argv ) widget = MyWidget( ) widget.resize( 640, 480 ) widget.show( ) sys.exit( app.exec_( ) )

    程序运行起来还行吧!
    0_1529422988117_5.png

    阅读更多
  • @jiangcaiyang 如果需要自动化测试,也用的上

    阅读更多

关注我们

微博
QQ群











召唤伊斯特瓦尔