Qt-可编辑的ListView
新建一个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的更多相关文章
- OSG嵌入QT(QT界面使用Qt Designer编辑)
本文主要内容:使用Qt Designer编辑好QT界面后,将OSG中的ViewerWidget嵌入到QT的Widget中. 在VS中嵌入QT工具,建立QT GUIApplication后,打开自动生成 ...
- QT creator 编辑多个UI 文件 出现 无法解析的外部符号的错误
创建一般的Qt Gui 程序一般会默认一个UI 文件 ,但是随着应用程序窗口的增多,同时编辑多个UI 界面是必须的. 假设我们已经创建好了一个QTUI的工程,里面已经默认了一个UI文件,但是想在添几个 ...
- ubuntu系统中Qt creator 编辑和应用使用中文输入法
在ubuntu系统的GUI开发过程中遇到在编辑器里面不能使用中文输入法,前提我已经安装了搜狗输入法,但是还是不能使用,原因是QT的库里没有最新fcix的库,. 没有安装搜狗的输入法的 https:// ...
- Qt - QLineEdit编辑框
QLineEdit输入内容获取及合理性检查? 控件自带触发信息: void textChanged(const QString &);void textEdited(const QString ...
- QT 下把编辑框内的中文字符转换为 char*
第一种方法 QString str(tr("你好")); wchar_t wc[100] = {0}; pEditShortDes->text().toWCharArray( ...
- QT-可拖拽可编辑的多控件ListView
目标 结合前面的2篇文章, 继续升级QML版本的ListView: 又要拖拽, 又要可编辑, 还得支持多个控件. 循序渐进 本文基于前一篇的基础: Qt-可编辑的ListView 要循序渐进的学习. ...
- Qt, 我回来了。。。
说起qt,大学时就有接触,但一直没有深入,这个周六周天利用两于时间重新温习了一下,跟之前用过的vs上的MFC.C++ builder比起来,Qt封装很人性化,库也比较全,写个 一般的小工具很轻松. 参 ...
- 简单QT应用了可实现手动布局QT应用
新建QT项目 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdG90b3R1enVvcXVhbg==/font/5a6L5L2T/fontsize/4 ...
- Qt入门之基础篇 ( 二 ) :Qt项目建立、编译、运行和发布过程解析
转载请注明出处:CN_Simo. 题解: 本篇内容主讲Qt应用从创建到发布的整个过程,旨在帮助读者能够快速走进Qt的世界. 本来计划是讲解Qt源码静态编译,如此的话读者可能并不能清楚地知道为何要静态编 ...
随机推荐
- 透彻详解(3)旁路电容100nF_0.1uF的由来计算
原文地址点击这里: 前一节我们已经详细解释了旁路电容在数字电路系统中所起的基本且重要作用,即储能与为高频噪声电流提供低阻抗路径,尽管还并未给旁路电容的这些功能概括一个"高大上"的名 ...
- vue调用子组件方法时,参数传不过去
有可能是因为子组件方法用了 async await 子组件去掉async就好了
- 携程二面:讲讲 MySQL 中的 WAL 策略和 CheckPoint 技术
前段时间我在准备暑期实习嘛,这是当时面携程的时候二面的一道问题,我一脸懵逼,赶紧道歉,不好意思不知道没了解过,面试官又解释说 redo log,我寻思着 redo log 我知道啊,WAL 是啥?给面 ...
- 12.10、elk实用案例
1.架构图: 服务器名称 ip地址 controller-node1(主) 172.16.1.90 slave-node1(从) 172.16.1.91 2.安装filebeat: filebeat不 ...
- liunx驱动之字符设备的注册
上一篇文章学习了如何编写linux驱动,通过能否正常加载模块进行验证是否成功,有做过liunx应用开发的小伙伴都知道驱动会在'/dev'目录下以文件的形式展现出来,所以只是能加载驱动模块不能算是完成驱 ...
- 堆&&优先队列&&TreeMap
题目描述 5710. 积压订单中的订单总数 题解 题目不难,主要是要读懂题意,一步步模拟,代码较长,需要细心检查. 坑较多,比如我犯了很多傻逼问题:想都不想就拿1<<9+7当作100000 ...
- php安裝7.3版本
CentOS 安装 EPEL 源: yum install epel-release 安装 REMI 源: CentOS 7: yum install http://rpms.remirepo.net ...
- WPF教程十四:了解元素的渲染OnRender()如何使用
上一篇分析了WPF元素中布局系统的MeasureOverride()和ArrangeOverride()方法.本节将进一步深入分析和研究元素如何渲染它们自身. 大多数WPF元素通过组合方式创建可视化外 ...
- spring、springmvc、springboot、springcloud的联系与区别
spring和springMvc: 1. spring是一个一站式的轻量级的java开发框架,核心是控制反转(IOC)和面向切面(AOP),针对于开发的WEB层(springMvc).业务层(Ioc) ...
- 灵魂画手的零基础python教程1:关于Python学习的误区、python的优缺点、前景
滴~ 近段时间,因为工作项目的原因,阿菌要重拾起python这门语言了,所以顺势写一门python教程,精心的编排,配上漫画和视频,希望能帮助更多想接触编程的同学入门,课程将从基础语法开始讲起,和大家 ...