新建一个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. hdu1233 最小生成树Prim算法和Kruskal算法

    Prim算法 时间复杂度:O(\(N^2\),N为结点数) 说明:先任意找一个点标记,然后每次找一条最短的两端分别为标记和未标记的边加进来,再把未标记的点标记上.即每次加入一条合法的最短的边,每次扩展 ...

  2. 怎样用好PS中的钢笔工具(附练习钢笔工具网站)

    想要在PS中得心应手的的描绘出自己想要的线条(也就是路径),就需要对[钢笔工具]有一个充分的理解. [钢笔工具]绘出来的线条全部都是贝赛尔曲线,所以你在学习[钢笔工具]之前,要补习一下贝赛尔曲线的常识 ...

  3. nginx负载均衡与反向代理

    1.集群的特点 (1)高性能 (2)价格有效性 (3)可伸缩性 (4)高可用性 (5)透明性 2.负载均衡概述 负载均衡,英文名称为Load Balance,其含义就是指将负载(工作任务)进行平衡.分 ...

  4. 如何使用「mkvtoolnix」和「GoldWave」仅保留视频中左、右声道的其中一个声道?

    为什么要这样做? 我手上有一部电视剧的视频文件(.rmvb),每个视频文件都是"国/粤双语"的,与其他双语视频的两种语言的音频保存在两个音轨上不同,我这里的视频文件的双语是分别保存 ...

  5. UI自动化学习笔记- Selenium一些特殊操作的处理

    一.特殊操作处理 1. 下拉选择框操作 1.1 如何操作下拉选择框 实现方式一 思路:先定位到要操作的option元素,然后执行点击操作 driver.find_element_by_css_sele ...

  6. CentOS-yum安装Redis(单点)

    源文件安装(推荐安装) 在CentOS系统中,首先安装EPEL仓库,然后更新yum源: $ yum install epel-release -y $ yum update -y 然后安装Redis数 ...

  7. Linux中grep和egrep命令详解

    rep / egrep 语法: grep  [-cinvABC]  'word'  filename -c :打印符合要求的行数-i :忽略大小写-n :在输出符合要求的行的同时连同行号一起输出-v ...

  8. spring集成flyway

    最近给公司项目集成flyway,由于我们项目移动端使用的是spring框架,网上看了很多博客,感觉这方面的东西还是很少的,毕竟现在是springboot的天下,大多数都是springboot集成fly ...

  9. Linux基本操作 [转]

    前言 只有光头才能变强 这个学期开了Linux的课程了,授课的老师也是比较负责任的一位.总的来说也算是比较系统地学习了一下Linux了~~~ 本文章主要是总结Linux的基础操作以及一些简单的概念~如 ...

  10. 章节1-Grafana Dashboard的简单应用(2)

    目录 使用Grafana创建可视化Dashboard 1. Add data sources - Prometheus 2. 导入 Dashboard 模板 2.1 Node Exporter for ...