qml 实现tableview 双击修改编辑,长按提示

2024-06-17 18:04

本文主要是介绍qml 实现tableview 双击修改编辑,长按提示,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

qml 实现tableview ,功能包括

1 样式设置,背景,行,列,表头,滚动条

 2 实现双击item ,进行编辑,按回车或者点击其他item,保存修改

 3 点击选中item

 4 长按 item,出现提示,鼠标释放,提示消失。

qml 代码

import QtQuick 2.6
import QtQuick.Window 2.2
import QtQuick.Layouts 1.2
import UserInfoModel 1.0import QtQuick 2.12import QtQuick 2.2
import QtQml.Models 2.2
//import QtQuick.Controls 2.12
//QtQuick.Controls 2.12  和QtQuick.Controls.Styles 1.4不匹配
import QtQuick.Controls.Styles 1.4
import QtQuick.Controls 1.4
import QtQuick.Controls 2.12
// import QtQuick.Controls 2.15//import QtQuick.Controls 2.5Window {id:window//anchors.centerIn: parentwidth: 650;height: 457visible: trueflags: Qt.FramelessWindowHint | Qt.DialogRectangle{id:rect1;anchors.fill: parent;border.width: 1;color: "blue";border.color: "red";clip:true//这一属性设置表示如果他的子类超出了范围,那么就剪切掉,不让他显示和起作用}//无边框移动MouseArea {id: dragRegionanchors.fill: parentproperty point clickPos: "0,0"onPressed: {clickPos = Qt.point(mouse.x,mouse.y)}onReleased: {clickPos = Qt.point(0,0)}onPositionChanged: {//鼠标偏移量var delta = Qt.point(mouse.x-clickPos.x, mouse.y-clickPos.y)//如果mainwindow继承自QWidget,用setPoswindow.setX(window.x+delta.x)window.setY(window.y+delta.y)}}UserInfoModel{id:datamodel}    TableView{property bool doublePress: falseproperty bool scliked: falseproperty int rowIndex: 0property int columnIndex: 0property string tabTitle:""property var lastTextEdit: nullproperty var lastRect: nullid :tableViewheight: 411width: 600x:10y:10    //        anchors.right: parent.right-10//        anchors.rightMargin: 0//        anchors.left: parent.left-10//        anchors.leftMargin: 0//        anchors.top: parent.top-10//        anchors.topMargin: 0//        anchors.bottom:  parent.bottom-10frameVisible: trueonSelectionChanged: {}Keys.onPressed:{if(event.key === Qt.Key_6 && event.modifiers === Qt.ControlModifier){console.log("key press"+ Qt.Key_6)event.accepted = true;}}Rectangle{id : dargRectwidth: 100height: 30visible: falsecolor: "lightpink";}//设置背景以及边框 效果已成//yellowstyle: TableViewStyle {backgroundColor: "#1F1F21" // 设置背景颜色为深蓝色frame: Rectangle {border.color: "yellow"border.width: 2}handle: Rectangle{//color: "#ff0000" // 设置滚动条背景颜色border.color: "green"border.width: 1Rectangle {radius: 12color: "#d1d3d5"anchors.fill: parent}}scrollBarBackground: Rectangle {color: "#ff00ff" // 设置滚动条背景颜色border.color: "green"border.width: 1implicitWidth: 10implicitHeight: 10   //可以改变高度}//连接处corner: Rectangle{color: "#47494C"border.color: "#2C2C2D"border.width: 1}//增量控制按钮incrementControl: Rectangle {color: "#353639"border.color: "#2C2C2D"border.width: 1implicitWidth: 10implicitHeight: 10Image {id: leftArrowx:parent.width/2-12y:parent.height/2-12source: "qrc:/arrow right.png"}} //滑块decrementControl: Rectangle {color: "#353639"border.color: "#2C2C2D"border.width: 1implicitWidth: 10implicitHeight: 10Image {id: rightArrowx:parent.width/2-12y:parent.height/2-12source: "qrc:/arrow left.png"}}  //滑块}TableViewColumn {id:columnIDrole: "userID"title: "ID"width: 80}TableViewColumn {id:columnNamerole: "userName"title: "姓名"width: tableView.width-80elideMode : Text.ElideLeft            }model:datamodel//行设置rowDelegate:Rectangle{id: rowDataheight:30color:styleData.selected?"lightblue":"lightgray"           }//自定义表头代理headerDelegate:Rectangle{border.width:1border.color: "red"color:styleData.selected ?"#1F1F21":"000000"//width: 100;height: 30Text{anchors.verticalCenter: parent.verticalCenteranchors.horizontalCenter: parent.horizontalCentertext: styleData.valuefont.pixelSize: 13color: "#ECEAE6"}}itemDelegate:Item {id: cellItemproperty bool  startPress: falseRectangle { anchors.left: parent.left; height: parent.height; width: 1; color: "transparent"}Rectangle { anchors.top: parent.top; width: parent.width; height: 1; color: "transparent"}Rectangle { anchors.right: parent.right; height: parent.height; width: 1; color: "#ff00ff"; }Rectangle { anchors.bottom: parent.bottom; width: parent.width; height: 1; color: "#ff00ff";  }Text {id:itemTextanchors.verticalCenter: parent.verticalCenteranchors.horizontalCenter: parent.horizontalCenterhorizontalAlignment: Text.AlignHCenterverticalAlignment: Text.AlignVCentertext: styleData.valuecolor: styleData.selected?"pink":"#ffffff"elide: Text.ElideLeftfont.pixelSize: 18}           MouseArea {anchors.fill: parentacceptedButtons: Qt.LeftButtononDoubleClicked:{if(styleData.column===1){console.log("Double clicked at: row=" + styleData.row + ", column=" + styleData.column+ ", text="+styleData.vaule)tableView.scliked = truetabTitleTextEdit.visible = truetabTitleTextEdit.forceActiveFocus()tableView.lastTextEdit = tabTitleTextEdit}}onClicked:{console.log("onClicked!!!!!!:"){tableView.selection.clear();tableView.selection.select(styleData.row);//双击选中某行if(tableView.scliked==true){console.log("visible"+tabTitleTextEdit.visible)tableView.lastTextEdit.accepted()}//console.log("signal clicked at: row=" + styleData.row + ", column=" + styleData.column+ ", text="+itemText.text)}}onPressAndHold:  {startPress = truevar row = styleData.rowtableView.selection.clear();tableView.selection.select(row);//双击选中某行var windowCoordinates = tableView.mapFromItem(cellItem,mouseX,mouseY);//console.log("Window coordinates:", windowCoordinates);dargRect.x = windowCoordinates.xdargRect.y = windowCoordinates.ydargRect.visible = true}onReleased:  {console.log("onReleased!!!!!!:")dargRect.visible = false}onPositionChanged:{var windowCoordinates = tableView.mapFromItem(cellItem,mouseX,mouseY);//console.log("onPositionChanged:"+ row );dargRect.x = windowCoordinates.xdargRect.y = windowCoordinates.yvar row = tableView.rowAt(windowCoordinates.x, windowCoordinates.y)tableView.selection.clear();tableView.selection.select(row);//双击选中某行}}TextInput {id: tabTitleTextEditRectangle{anchors.fill: parentborder.color: "yellow"border.width: 2color: "#000000"z:-1}focus: truetext: itemText.textwidth: parent.widthheight: parent.heightanchors.fill: parentselectByMouse: trueselectionColor: "#4283aa"selectedTextColor: "#ffffff"visible: falsecursorVisible:truefont.pointSize :13readOnly: falsecolor: "#ffffff"horizontalAlignment: Text.AlignHCenterverticalAlignment: Text.AlignVCenter  // @disable-check M16onAccepted: {tableView.lastTextEdit.visible = false;tableView.scliked =falsedatamodel.modifyItemText(styleData.row,styleData.column,text)console.log("onAccepted at: row=" + styleData.row + ", column=" + styleData.column+ ", status="+tableView.scliked)}}}focus:true}Button {id: button1x: parent.width-80y: parent.height-36width:70height:30//text: qsTr("Button")Rectangle{anchors.fill: parentborder.color: "royalblue"border.width: 1color: button1.down ? "red" :(button1.hovered?"blue":"lightsteelblue")}Text {text: "1213";// anchors.fill: parentanchors.centerIn: parent;color: button1.hovered?"yellow":"red";font.pixelSize: 13;//font.weight: Font.DemiBold}onClicked: {datamodel.insertUserInfo("002","张三");window.close();}}
}

c++ 代码

UserInfoModel.h

#ifndef USERINFOMODEL_H
#define USERINFOMODEL_H#include <QAbstractTableModel>
#include <QtCore/QMetaEnum>#include <QAbstractTableModel>
#include <QtCore/QMetaEnum>struct TestData
{QString index;QString name;TestData& operator = (const TestData& data) {this->index = data.index;this->name = data.name;return *this;}
};
class UserInfoModel : public QAbstractTableModel
{Q_OBJECT
public:enum DataRoles{userID = Qt::UserRole + 1,userName};Q_ENUM(DataRoles)explicit UserInfoModel(QObject *parent = 0);// Basic functionality:int rowCount(const QModelIndex &parent = QModelIndex()) const override;int columnCount(const QModelIndex &parent = QModelIndex()) const override;QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;QHash<int, QByteArray> roleNames() const override;Qt::ItemFlags flags(const QModelIndex &index) const override;Q_INVOKABLE void insertUserInfo(QString userID,QString userName);Q_INVOKABLE void modifyItemText(int row,int column,QString text);
private:QList<QMap<QString,QVariant>> userList;QVector<TestData> m_listData;
};
#endif // USERINFOMODEL_H

UserInfoModel.cpp

#include "userinfomodel.h"
#include <QDebug>
UserInfoModel::UserInfoModel(QObject *parent): QAbstractTableModel(parent)
{for(int i=0;i<6;i++){TestData oneData;oneData.index = QString::number(i);oneData.name  = QString("张三%1").arg(i);m_listData.append(oneData);}  
}
int UserInfoModel::rowCount(const QModelIndex &parent) const
{return m_listData.count();
}int UserInfoModel::columnCount(const QModelIndex &parent) const
{return 2;
}
Qt::ItemFlags UserInfoModel::flags(const QModelIndex &index) const
{Q_UNUSED(index)if(index.column() ==1){qDebug()<<"UserInfoModel::flags  1111";return Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsEditable;}return Qt::ItemIsSelectable | Qt::ItemIsEnabled;
}
QVariant UserInfoModel::data(const QModelIndex &index, int role) const
{// FIXME: Implement me!QVariant var;if ( !index.isValid() ){return QVariant();}int nRow    = index.row();int nColumn = index.column();//qDebug()<<"data"<<nRow<<nColumn<<role;if(Qt::UserRole+1 == role){var = QVariant::fromValue(m_listData.at(nRow).index);}else if(Qt::UserRole+2 == role){var = QVariant::fromValue(m_listData.at(nRow).name);// qDebug()<<"m_listData.at(nRow).name"<<m_listData.at(nRow).name;}return var;// QHash<int, QByteArray> temp=roleNames();// QString key =  temp.value(role);// return userList[index.row()].value(key);
}QHash<int, QByteArray> UserInfoModel::roleNames() const
{QHash<int, QByteArray> roles;QMetaEnum metaEnum = QMetaEnum::fromType<DataRoles>();for (int i=0; i<metaEnum.keyCount(); ++i){roles[metaEnum.value(i)]=QByteArray(metaEnum.key(i));}return roles;
}void UserInfoModel::insertUserInfo(QString userID, QString userName)
{   TestData oneData;oneData.index = QString::number(100);oneData.name  = QString("张三%1").arg(oneData.index);m_listData.append(oneData);beginResetModel();endResetModel();
//    emit beginInsertRows(QModelIndex(),userList.count(),userList.count());
//    QMap<QString,QVariant> mapTemp;
//    mapTemp.insert("userID",userID);
//    mapTemp.insert("userName",userName);
//    userList.push_back(mapTemp);//    emit endInsertRows();
}
void UserInfoModel::modifyItemText(int row,int column,QString text)
{// QModelIndex index = this->index(row,column);// QString  name  = index.data(Qt::UserRole+2).toString();// qDebug()<<"modifyItemText"<<name;QModelIndex index = this->index(row,column);TestData oneData  = m_listData.at(row);if(column==0){oneData.index = text;}else{oneData.name = text;}m_listData.replace(row,oneData);for(int i=0;i<m_listData.size();i++){TestData oneData  = m_listData.at(i);// qDebug()<<"oneData"<<i<<oneData.index<<oneData.name;}beginResetModel();endResetModel();}

main.cpp

#include <QApplication>
#include <QQmlApplicationEngine>
#include <QObject>
#include <QDebug>
#include <QQmlComponent>
#include <QQuickView>
#include <QQmlProperty>
#include <QQuickItem>
#include "UserInfoModel.h"
#include <QQmlContext>
int main(int argc, char *argv[])
{QGuiApplication app(argc, argv);QQmlApplicationEngine engine;qmlRegisterType<UserInfoModel>("UserInfoModel", 1, 0, "UserInfoModel");engine.load(QUrl(QStringLiteral("qrc:/ui.qml")));return app.exec();
}

好了至此可以运行了运行界面如下,可以自行修改颜色:

源码已上传,不能下载的可以联系我 邮箱:moseman@163.com 

这篇关于qml 实现tableview 双击修改编辑,长按提示的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1070160

相关文章

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

让树莓派智能语音助手实现定时提醒功能

最初的时候是想直接在rasa 的chatbot上实现,因为rasa本身是带有remindschedule模块的。不过经过一番折腾后,忽然发现,chatbot上实现的定时,语音助手不一定会有响应。因为,我目前语音助手的代码设置了长时间无应答会结束对话,这样一来,chatbot定时提醒的触发就不会被语音助手获悉。那怎么让语音助手也具有定时提醒功能呢? 我最后选择的方法是用threading.Time

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

Kubernetes PodSecurityPolicy:PSP能实现的5种主要安全策略

Kubernetes PodSecurityPolicy:PSP能实现的5种主要安全策略 1. 特权模式限制2. 宿主机资源隔离3. 用户和组管理4. 权限提升控制5. SELinux配置 💖The Begin💖点点关注,收藏不迷路💖 Kubernetes的PodSecurityPolicy(PSP)是一个关键的安全特性,它在Pod创建之前实施安全策略,确保P

工厂ERP管理系统实现源码(JAVA)

工厂进销存管理系统是一个集采购管理、仓库管理、生产管理和销售管理于一体的综合解决方案。该系统旨在帮助企业优化流程、提高效率、降低成本,并实时掌握各环节的运营状况。 在采购管理方面,系统能够处理采购订单、供应商管理和采购入库等流程,确保采购过程的透明和高效。仓库管理方面,实现库存的精准管理,包括入库、出库、盘点等操作,确保库存数据的准确性和实时性。 生产管理模块则涵盖了生产计划制定、物料需求计划、

C++——stack、queue的实现及deque的介绍

目录 1.stack与queue的实现 1.1stack的实现  1.2 queue的实现 2.重温vector、list、stack、queue的介绍 2.1 STL标准库中stack和queue的底层结构  3.deque的简单介绍 3.1为什么选择deque作为stack和queue的底层默认容器  3.2 STL中对stack与queue的模拟实现 ①stack模拟实现