新建一个QML项目, main.cpp不动如下:

#include <QGuiApplication>
#include <QQmlApplicationEngine> int main(int argc, char *argv[])
{
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling); QGuiApplication app(argc, argv); 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();
}

主界面main.qml如下

import QtQuick 2.12
import QtQuick.Window 2.12 Window {
visible: true
width: 640
height: 480
title: qsTr("Hello World") DemoList {
anchors.centerIn: parent
width: parent.width
height: parent.height
} }

用到的Model文件 MyModel.qml 如下:

import QtQuick 2.0

ListModel {
ListElement {
description: "Wash the car"
done: true
}
ListElement {
description: "Read a book"
done: false
} ListElement {
description: "Buy a cup"
done: false
} }

主要界面 DemoList.qml :

import QtQuick 2.12
import QtQuick.Controls 2.5
import QtQuick.Layouts 1.3
import QtQml.Models 2.1 /**
方法2: 通过设置currentIndex, 属性自动变化. 支持键盘
*/
ColumnLayout { RowLayout { Layout.fillHeight: true Layout.leftMargin: 10
Layout.rightMargin: 20
Layout.alignment: Qt.AlignHCenter | Qt.AlignTop Component {
id: delegateItem Rectangle {
id: dragRect
height: 50
width: parent.width onFocusChanged: {
if(focus){
console.debug("got focus dragRect" );
textinput.focus = true;
}
} CheckBox {
id: chkbox
width: 50
checked: model.done
onClicked: model.done = checked
} Rectangle {
id: textSection
height: parent.height width: parent.width - chkbox.width
anchors.left: chkbox.right Text {
id: textShow text: model.description
font.underline: true
font.bold: true
anchors.verticalCenter: parent.verticalCenter visible: !dragRect.ListView.isCurrentItem
color: "black" } //end textShow TextInput {
id: textinput anchors.verticalCenter: parent.verticalCenter color: "blue" text: model.description
visible: dragRect.ListView.isCurrentItem
enabled: dragRect.ListView.isCurrentItem
focus: true onFocusChanged: {
if(focus){
console.debug("got focus" + "textInput");
}
} onEditingFinished: {
model.description = textinput.text //方法1: 设置index
if(listView.currentIndex == index){
listView.currentIndex = -1;
} console.log(("TextInput listview currentIndex: " + listView.currentIndex + " index: " + index ))
console.log(("TextInput ListView isCurrentItem: " + dragRect.ListView.isCurrentItem)) } } //end TextInput } //end textSection Rectangle MouseArea {
id: mouseArea
width: parent.width
height: parent.height
hoverEnabled: true z: -1 //避免遮住checkbox onClicked: {
//方法1: 设置当前
listView.currentIndex = index console.log(("MouseArea listview currentIndex: " + listView.currentIndex + " index: " + index ))
console.log(("MouseArea ListView isCurrentItem: " + dragRect.ListView.isCurrentItem)) // 在dragRect的 onFocusChanged 中设置了, 此处不需要了
//textinput.focus = true;
}
} }
} //end Row Rectangle ListView {
id: listView
Layout.fillWidth: true
Layout.fillHeight: true
keyNavigationEnabled: true //clip: true
model: MyModel {}
delegate: delegateItem //默认不要是第一个, 否则第一个是可编辑状态(针对方法1)
Component.onCompleted : {
currentIndex = -1;
} //默认焦点
focus: true
}
} RowLayout {
Button {
text: qsTr("Add New Item")
Layout.fillWidth: true onClicked: {
var c = listView.model.rowCount();
listView.model.append({
"description": "Buy a new book " + (c + 1),
"done": false
}) //设置焦点, 否则listView就没焦点了
listView.focus = true;
listView.currentIndex = c;
}
}
}
}

几个关键点, 详见代码:

  • Text/TextInput的visible属性
  • MouseArea的点击事件: 设置 listView.currentIndex = index
  • MouseArea避免遮挡: z: -1 //避免遮住checkbox
  • ListView的 Component.onCompleted, 设置默认不选中
  • ListView默认设置: focus: true
  • TextInput的onEditingFinished, 处理编辑完成事件
  • 组件dragRect的onFocusChanged, 使TextInput获得焦点

项目代码

https://github.com/cnscud/learn/tree/master/qt/editListView

Qt-可编辑的ListView的更多相关文章

  1. OSG嵌入QT(QT界面使用Qt Designer编辑)

    本文主要内容:使用Qt Designer编辑好QT界面后,将OSG中的ViewerWidget嵌入到QT的Widget中. 在VS中嵌入QT工具,建立QT GUIApplication后,打开自动生成 ...

  2. QT creator 编辑多个UI 文件 出现 无法解析的外部符号的错误

    创建一般的Qt Gui 程序一般会默认一个UI 文件 ,但是随着应用程序窗口的增多,同时编辑多个UI 界面是必须的. 假设我们已经创建好了一个QTUI的工程,里面已经默认了一个UI文件,但是想在添几个 ...

  3. ubuntu系统中Qt creator 编辑和应用使用中文输入法

    在ubuntu系统的GUI开发过程中遇到在编辑器里面不能使用中文输入法,前提我已经安装了搜狗输入法,但是还是不能使用,原因是QT的库里没有最新fcix的库,. 没有安装搜狗的输入法的 https:// ...

  4. Qt - QLineEdit编辑框

    QLineEdit输入内容获取及合理性检查? 控件自带触发信息: void textChanged(const QString &);void textEdited(const QString ...

  5. QT 下把编辑框内的中文字符转换为 char*

    第一种方法 QString str(tr("你好")); wchar_t wc[100] = {0}; pEditShortDes->text().toWCharArray( ...

  6. QT-可拖拽可编辑的多控件ListView

    目标 结合前面的2篇文章, 继续升级QML版本的ListView: 又要拖拽, 又要可编辑, 还得支持多个控件. 循序渐进 本文基于前一篇的基础: Qt-可编辑的ListView 要循序渐进的学习. ...

  7. Qt, 我回来了。。。

    说起qt,大学时就有接触,但一直没有深入,这个周六周天利用两于时间重新温习了一下,跟之前用过的vs上的MFC.C++ builder比起来,Qt封装很人性化,库也比较全,写个 一般的小工具很轻松. 参 ...

  8. 简单QT应用了可实现手动布局QT应用

     新建QT项目 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdG90b3R1enVvcXVhbg==/font/5a6L5L2T/fontsize/4 ...

  9. Qt入门之基础篇 ( 二 ) :Qt项目建立、编译、运行和发布过程解析

    转载请注明出处:CN_Simo. 题解: 本篇内容主讲Qt应用从创建到发布的整个过程,旨在帮助读者能够快速走进Qt的世界. 本来计划是讲解Qt源码静态编译,如此的话读者可能并不能清楚地知道为何要静态编 ...

随机推荐

  1. 搭建DG(data guard),及搭建过程中遇到的一些小问题

    一.准备工作:主库:虚拟机名称host06 主机名:host06 IP:192.168.100.60 db_name&SID:ENMO  db_unique_name:PROD 存储:文件系统 ...

  2. 如何回答面试中问到的Hibernate和MyBatis的区别

    这边主要是写给那些准备去面试的(没什么经验的)应聘者看的,为了在面试中更好的回答这个问题,我做一个简单的梳理和总结. 作为一名职场新人,经历过多次的面试,由于在简历中提及了Hibernate和MyBa ...

  3. 文字识别OCR开源框架的对比--Tesseract vs EasyOCR

    ​ 前言: OCR文字识别在目前有着比较好的应用,也出现了很多的文字识别软件,但软件是面向用户的.对于我们技术人员来说,有时难免需要在计算机视觉任务中加入文字识别,如车牌号识别,票据识别等,因此软件对 ...

  4. java 写webservice接口解析xml报文

    1 <!--解析xml报文--> 2 <dependency> 3 <groupId>dom4j</groupId> 4 <artifactId& ...

  5. hive学习笔记之四:分区表

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  6. 1、SpringBoot整合之SpringBoot整合JSP

    SpringBoot整合JSP 一.创建SpringBoot项目,仅选择Web模块即可 二.在POM文件中添加依赖 <!-- 添加servlet依赖模块 --> <dependenc ...

  7. Redis并发竞争key的解决方案详解

    1. 需求由来 1.Redis高并发的问题 Redis缓存的高性能有目共睹,应用的场景也是非常广泛,但是在高并发的场景下,也会出现问题:缓存击穿.缓存雪崩.缓存和数据一致性,以及今天要谈到的缓存并发竞 ...

  8. MIT6.828 Lab3 User Environments

    Lab3 这个实验分成了两个大部分. 1. PartA User Environments and Exception Handling kernel使用Env这个数据结构来trace每一个user ...

  9. Qt 串口通信之使用16进制发送数据的转换方式

    Qt 串口通信之使用16进制发送数据的转换方式 一 概述 有时候在做上位机串口通讯时,经常需要将字符串转成16进制的形式作为发送,借此分析记录一下. 二 需求分析 //假设需要转换的字符:如下 QSt ...

  10. 66.QT-线程并发、QTcpServer并发、QThreadPool线程池

    1.线程并发一个程序内部能拥有多个线程并行执行.一个线程的执行可以被认为是一个CPU在执行该程序.当一个程序运行在多线程下,就好像有多个CPU在同时执行该程序.总之,多线程即可以这么理解:多线程是处理 ...