首页 > 其他分享 >Qt中QItemEditorFactory的使用

Qt中QItemEditorFactory的使用

时间:2024-01-10 11:01:21浏览次数:26  
标签:MDiyBox const Qt value QItemEditorFactory 使用 MDiyDelegate MDiyType new

一般而言QItemEditorFactory是用于替换Qt中已有的数据类型的编辑器控件。因为如果是自定义类型的话,用它也比较复杂,还不如直接自定义一个新的QStyledItemDelegate。尽管如此,本文也给出一个自定义数据类型的例子,用于解释QItemEditorFactory的用法。本例子开发环境是VS2017和Qt5.9。下图是代码运行截图:

Misc.h文件。下方的MDiyType就是我们的自定义类型。MDiyBox是单元格处于编辑状态时用于编辑MDiyType的编辑框。MDiyDelegate是我们的委托,它只实现了displayText(...)函数用于将自定义类型转换成字符串用于在非编辑状态下显示数据:

struct MDiyType
{
    int value;
};

Q_DECLARE_METATYPE(MDiyType);

class MDiyBox : public QSpinBox
{
    Q_OBJECT
    Q_PROPERTY(MDiyType value READ value WRITE setValue)

public:
    MDiyBox(QWidget* parent = 0);
    MDiyType value() const;
    void setValue(const MDiyType& v);
};

class MDiyDelegate : public QStyledItemDelegate
{
    Q_OBJECT

public:
    MDiyDelegate(QObject *parent = 0);
    QString displayText(const QVariant &value, const QLocale &locale) const override;
};

Misc.cpp文件:

MDiyBox::MDiyBox(QWidget* parent) : 
    QSpinBox(parent)
{
    setRange(0, 1000);
    setStyleSheet(u8R"(MDiyBox { border: 1px solid rgb(255, 12, 12); })");
}

MDiyType MDiyBox::value() const
{
    return MDiyType{ QSpinBox::value() };
}

void MDiyBox::setValue(const MDiyType& v)
{
    QSpinBox::setValue(v.value);
}

/////////////////////////////////////////////////////////////////////////////////////////

MDiyDelegate::MDiyDelegate(QObject *parent) :
    QStyledItemDelegate(parent)
{
}

/* 此函数用于将自定义类型转换成字符串 */
/* 否则的话QTableView不知道如何显示自定义类型MDiyType */
QString MDiyDelegate::displayText(const QVariant &value, const QLocale &locale) const
{
    MDiyType data = value.value<MDiyType>();
    return QString::number(data.value);
}

主窗口的构造函数如下。下面的代码中QtTest是主窗口类,ui.tvHost是QTableView控件。变量spinFact要在程序结束时自己手动释放,因为它不是QObject的子类,无法实现自动释放:

QtTest::QtTest(QWidget *parent)
    : QMainWindow(parent)
{
    ui.setupUi(this);

    int diyTypeId = qRegisterMetaType<MDiyType>("MDiyType");
    MDiyDelegate* spinDel = new MDiyDelegate(ui.tvHost);
    QItemEditorFactory* spinFact = new QItemEditorFactory; /* 这个指针要自己释放 */
    QItemEditorCreatorBase* spinBase = new QItemEditorCreator<MDiyBox>("value");
    spinFact->registerEditor(diyTypeId, spinBase);
    spinDel->setItemEditorFactory(spinFact);
    ui.tvHost->setItemDelegateForColumn(0, spinDel);

    QStandardItemModel* model = new QStandardItemModel(ui.tvHost);
    QStandardItem* item0 = new QStandardItem;
    item0->setData(QVariant::fromValue(MDiyType{ 123 }), Qt::DisplayRole);
    model->setItem(0, item0);
    QStandardItem* item1 = new QStandardItem;
    item1->setData(QVariant::fromValue(MDiyType{ 456 }), Qt::DisplayRole);
    model->setItem(1, item1);
    QStandardItem* item2 = new QStandardItem;
    item2->setData(QVariant::fromValue(MDiyType{ 789 }), Qt::DisplayRole);
    model->setItem(2, item2);
    QStandardItem* item3 = new QStandardItem;
    item3->setData(QVariant::fromValue(MDiyType{ 101 }), Qt::DisplayRole);
    model->setItem(3, item3);
    ui.tvHost->setModel(model);
}

 

标签:MDiyBox,const,Qt,value,QItemEditorFactory,使用,MDiyDelegate,MDiyType,new
From: https://www.cnblogs.com/mengxiangdu/p/17859395.html

相关文章

  • 比较一下配置类加注解的方式和使用XML的区别
    使用注解和配置类的方式相较于XML方式,有以下几个优点:简化配置:通过使用注解和配置类,可以将SQL语句和映射配置直接写在Java代码中,避免了繁琐的XML配置。这样可以使配置更加简洁明了,减少了编写和维护配置文件的工作量。提高可读性:注解和配置类的方式将相关的配置信息直接与代码......
  • 如何使用 Helm 在 K8s 上集成 Prometheus 和 Grafana|Part 2
    在Part1中,我们一起了解了什么是Prometheus和Grafana,以及使用这些工具的前提条件和优势。在本部分,将继续带您学习如何安装Helm以及如何使用PrometheusHelmCharts。 开始使用Helm和HelmChartArtifactHub为HelmChart提供了公共和私有资源库。我们将使用这些H......
  • 使用IDL进行氚羽流监测(三)——绘制含水层相对流速
    本文我们将介绍描述研究区的另一个特征:研究区域含水层的相对流速。本例使用GRIDDATA和CONTOUR生成基础地形图,并在其上绘制含水层流速的矢量图。将地形数据网格化使用文件"TankDataTerrain.csv"中的数据(可参阅"对研究区域和环境进行建模"一文),绘制地形等高线图,作为流向矢......
  • java工作流引擎-j-roadflow-plus使用快速入门
    新建一个流程并发布运行需要以下步骤:1、新建表单。    在表单管理中新建表单,并设计表单,在表单中拖入控件。        点新建按钮会进入表单设计界面,并自动弹出表单属性设置。        输入表单名称,选择数据连接,数据表选择已有的测试表rf_form_test,主键选id......
  • 在IDEA中配置使用DOC(cmd)命令行窗口
    在IDEA中配置使用DOC(cmd)命令行窗口一、基本设置步骤①中文设置->工具->终端->修改shell路径为C:\Windows\System32\cmd.exe(cmd.exe路径)。②英文Settings...->Tools->Terminal->将Shellpath修改为C:\Windows\System32\cmd.exe(cmd.exe路径)。二、设置演......
  • Qt QProcess进程间调用及交互通信,完整示例
    1.概述使用Qt进行应用程序开发,主要是通过QProcess类用于启动外部程序并与其进行通信.1.1.运行进程要启动进程,需要运行的程序的名称和命令行参数作为参数传递给start()。参数以QStringList形式提供。start()方法原型:voidstart(constQString&program,constQStringList&a......
  • 【Application Insights】使用Powershell命令向Application Insgihts发送测试数据
    问题描述在昨天的文章中,介绍了“【ApplicationInsights】使用CURL命令向ApplicationInsgihts发送测试数据 ”,今天则继续实验通过PowerShell命令来发送测试数据到ApplicationInsights 问题解答从参考文档中复制出Powershell脚本,然后只需要修改ApplicationInsights的Connect......
  • Qt 快速读取大文件最后一行内容
    0.前言有时候根据需求,需要读取文本的最后一行内容。如果是小文本,按照顺序读,然后取最后一行就Ok;但如果是大文本,即使是放到线程里跑,读取到最后一行也会有延迟,比较耗时。1.解决方案查看QFile帮助手册,其有boolseek(qint64pos);意思就是查找设备中的位置。成功时返回true;否......
  • 如何使用Jamf管理Apple文件保险箱
    在当今的移动工作和教育环境中,Apple设备的一个关键功能是内置的macOS加密技术,该技术保护组织数据和用户隐私。配备AppleM1芯片的最新计算机还具有额外的加密功能。虽然这些安全层有助于保护最终用户手中的设备,无论他们在哪里工作或学习,但这也意味着Mac管理员需要加密特权来......
  • hangfire使用
    #hangfire使用usingSystem;usingHangfire;usingHangfire.SqlServer;usingHangfire.Storage.SQLite;namespaceConsoleApplication2{classProgram{staticvoidMain(){GlobalConfiguration.Configuration......