在Qt中,如何正确实现委托?

2024-05-26

我遵循模型/视图/控制器范例。我很确定模型和视图是正确的,但我认为我的代表做错了一些事情。一切都“有效”,除了第一次单击控件只是“点亮控件”而第二次单击与之交互之外。这是代表通常的实施方式吗?我的实现需要大量的构造和销毁(由scoped_ptr隐藏),因此任何有关这方面的提示也很有帮助。

QWidget *ParmDelegate::createWidget(const QModelIndex &index) const {
    if (!index.isValid())
        return NULL;
    const Parm  *p = static_cast<const Parm*>(index.internalPointer());
    QWidget *w = p->createControl();
    w->setAutoFillBackground(true);
    w->setBackgroundRole(QPalette::Base);  // white background instead of grey
    return w;
}

QWidget*
ParmDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const {
    QWidget *retval = createWidget(index);
    if (dynamic_cast<QComboBox*>(retval))
        connect(retval, SIGNAL(activated(int)), this, SLOT(commitAndCloseEditor()));
    else if (dynamic_cast<QSlider*>(retval))
        connect(retval, SIGNAL(sliderReleased()), this, SLOT(commitAndCloseEditor()));
    else if (dynamic_cast<QAbstractButton*>(retval))
        connect(retval, SIGNAL(clicked()), this, SLOT(commitAndCloseEditor()));
    else
        connect(retval, SIGNAL(editingFinished()), this, SLOT(commitAndCloseEditor()));
    retval->setFocusPolicy(Qt::StrongFocus);
    retval->setParent(parent);
    return retval;
}

void
ParmDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const {
    const Parm  *p = static_cast<const Parm*>(index.internalPointer());
    p->setEditorData(editor);
}

void
ParmDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const {
    ParmControl::Base*  base = dynamic_cast<ParmControl::Base*>(editor);
    model->setData(index, base->toQVariant());
}

void
ParmDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const {
    editor->setGeometry(option.rect);
}

void
ParmDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const {
    scoped_ptr<QWidget> w(createWidget(index));
    if (!w)
        return;
    const Parm  *p = static_cast<const Parm*>(index.internalPointer());
    setEditorData(w.get(), index);
    w->setGeometry(option.rect);
    w->render(painter, option.rect.topLeft());
}

QSize
ParmDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const {
    scoped_ptr<QWidget> w(createWidget(index));
    if (!w)
        return QSize(0,0);
    return w->sizeHint();
}

void
ParmDelegate::commitAndCloseEditor() {
    QWidget *editor = static_cast<QWidget *>(sender());
    ParmControl::Base* base = dynamic_cast<ParmControl::Base*>(editor);
    emit commitData(editor);
    emit closeEditor(editor, QAbstractItemDelegate::EditNextItem);
}

如果您有兴趣更改自定义编辑器的显示条件,请使用QAbstractItemView::setEditTriggers()。尽管您的委托负责将信息传入和传出自定义编辑器,但视图决定编辑器何时启动。

文档参考:http://doc.qt.digia.com/4.5/qabstractitemview.html#editTriggers-prop http://doc.qt.digia.com/4.5/qabstractitemview.html#editTriggers-prop.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在Qt中,如何正确实现委托? 的相关文章

  • 编译时运算符

    有人可以列出 C 中可用的所有编译时运算符吗 C 中有两个运算符 无论操作数如何 它们的结果始终可以在编译时确定 它们是sizeof 1 and 2 当然 其他运算符的许多特殊用途可以在编译时解决 例如标准中列出的那些整数常量表达式 1 与
  • C 编程 - 文件 - fwrite

    我有一个关于编程和文件的问题 while current NULL if current gt Id Doctor 0 current current gt next id doc current gt Id Doctor if curre
  • Web 客户端和 Expect100Continue

    使用 WebClient C NET 时设置 Expect100Continue 的最佳方法是什么 我有下面的代码 我仍然在标题中看到 100 continue 愚蠢的 apache 仍然抱怨 505 错误 string url http
  • 在结构中使用 typedef 枚举并避免类型混合警告

    我正在使用 C99 我的编译器是 IAR Embedded workbench 但我认为这个问题对于其他一些编译器也有效 我有一个 typedef 枚举 其中包含一些项目 并且我向该新类型的结构添加了一个元素 typedef enum fo
  • 不支持将数据直接绑定到存储查询(DbSet、DbQuery、DbSqlQuery)

    正在编码视觉工作室2012并使用实体模型作为我的数据层 但是 当页面尝试加载时 上面提到的标题 我使用 Linq 语句的下拉控件往往会引发未处理的异常 下面是我的代码 using AdventureWorksEntities dw new
  • 用于检查类是否具有运算符/成员的 C++ 类型特征[重复]

    这个问题在这里已经有答案了 可能的重复 是否可以编写一个 C 模板来检查函数是否存在 https stackoverflow com questions 257288 is it possible to write a c template
  • 嵌套接口:将 IDictionary> 转换为 IDictionary>?

    我认为投射一个相当简单IDictionary
  • 用于登录 .NET 的堆栈跟踪

    我编写了一个 logger exceptionfactory 模块 它使用 System Diagnostics StackTrace 从调用方法及其声明类型中获取属性 但我注意到 如果我在 Visual Studio 之外以发布模式运行代
  • C#中如何移动PictureBox?

    我已经使用此代码来移动图片框pictureBox MouseMove event pictureBox Location new System Drawing Point e Location 但是当我尝试执行时 图片框闪烁并且无法识别确切
  • 带动态元素的 WPF 启动屏幕。如何?

    我是 WPF 新手 我需要一些帮助 我有一个加载缓慢的 WPF 应用程序 因此我显示启动屏幕作为权宜之计 但是 我希望能够在每次运行时更改屏幕 并在文本区域中显示不同的引言 这是一个生产力应用程序 所以我将使用非愚蠢但激励性的引言 当然 如
  • 使用 Bearer Token 访问 IdentityServer4 上受保护的 API

    我试图寻找此问题的解决方案 但尚未找到正确的搜索文本 我的问题是 如何配置我的 IdentityServer 以便它也可以接受 授权带有 BearerTokens 的 Api 请求 我已经配置并运行了 IdentityServer4 我还在
  • Windows 窗体:如果文本太长,请添加新行到标签

    我正在使用 C 有时 从网络服务返回的文本 我在标签中显示 太长 并且会在表单边缘被截断 如果标签不适合表单 是否有一种简单的方法可以在标签中添加换行符 Thanks 如果您将标签设置为autosize 它会随着您输入的任何文本自动增长 为
  • 如何使用 C# / .Net 将文件列表从 AWS S3 下载到我的设备?

    我希望下载存储在 S3 中的多个图像 但目前如果我只能下载一个就足够了 我有对象路径的信息 当我运行以下代码时 出现此错误 遇到错误 消息 读取对象时 访问被拒绝 我首先做一个亚马逊S3客户端基于我的密钥和访问配置的对象连接到服务器 然后创
  • 将控制台重定向到 .NET 程序中的字符串

    如何重定向写入控制台的任何内容以写入字符串 对于您自己的流程 Console SetOut http msdn microsoft com en us library system console setout aspx并将其重定向到构建在
  • C# 成员变量继承

    我对 C 有点陌生 但我在编程方面有相当广泛的背景 我想做的事情 为游戏定义不同的 MapTiles 我已经像这样定义了 MapTile 基类 public class MapTile public Texture2D texture pu
  • 基于 OpenCV 边缘的物体检测 C++

    我有一个应用程序 我必须检测场景中某些项目的存在 这些项目可以旋转并稍微缩放 更大或更小 我尝试过使用关键点检测器 但它们不够快且不够准确 因此 我决定首先使用 Canny 或更快的边缘检测算法 检测模板和搜索区域中的边缘 然后匹配边缘以查
  • 测试用例执行完成后,无论是否通过,如何将测试用例结果保存在变量中?

    我正在使用 NUNIT 在 Visual Studio 中使用 Selenium WebDriver 测试用例的代码是 我想在执行测试用例后立即在变量中记录测试用例通过或失败的情况 我怎样才能实现这一点 NUnit 假设您使用 NUnit
  • C# 模拟VolumeMute按下

    我得到以下代码来模拟音量静音按键 DllImport coredll dll SetLastError true static extern void keybd event byte bVk byte bScan int dwFlags
  • 哪种 C 数据类型可以表示 40 位二进制数?

    我需要表示一个40位的二进制数 应该使用哪种 C 数据类型来处理这个问题 如果您使用的是 C99 或 C11 兼容编译器 则使用int least64 t以获得最大的兼容性 或者 如果您想要无符号类型 uint least64 t 这些都定
  • C# - OutOfMemoryException 在 JSON 文件上保存列表

    我正在尝试保存压力图的流数据 基本上我有一个压力矩阵定义为 double pressureMatrix new double e Data GetLength 0 e Data GetLength 1 基本上 我得到了其中之一pressur

随机推荐

  • Akka/Scala:映射 Future 与 pipelineTo

    In Akka参与者 在发送一个Future结果给另一个演员 A 映射Future发挥作用tell结果给演员 B 定义一个onSuccess未来的回调 其中tell结果给演员 C 管道Future结果给演员pipeTo 其中一些选项已在上一
  • 在Container上手动触发Pull刷新

    如果我想在加载表单后手动触发 Codename One 中的容器上的 拉取刷新 如果有人有任何想法 请告知 很简单 技巧就是使用showListener 假设这是起始代码 取自 Codename One 开发人员指南 拉动刷新 部分 htt
  • 计算唯一值的数量

    如果我有三列 orderNumber name email 我想计算表中有多少个唯一的电子邮件 我该怎么做 像这样的声明 SELECT count email FROM orders 给我总数 I tried SELECT DISTINCT
  • 如何将背景音乐添加到我的 spritekit 文件中

    有人可以给我一个快速简单的步骤 以便在我的应用程序加载后添加背景 m4a 音乐 它是一个精灵套件Xcode文件 音乐是m4a格式 谢谢 尝试用这个 import AVFoundation AVAudioPlayer backgroundMu
  • 如何将 NSDictionary 转换为 NSData,反之亦然?

    我正在发送NSString and UIImage使用蓝牙 我决定将两者都存储在NSDictionary然后将字典转换为NSData 我的问题是如何转换NSDictionary to NSData反之亦然 NSDictionary gt N
  • 为什么 Xcode 会为选择器列出自动完成方法?

    自从我升级到最新的 Xcode 以来 自动完成功能就列出了 删除线 方法selector目的 我无法判断这是 Xcode 的错误还是有一些我不知道的新语法更改 如果你把它插入你的 Playground 并删除里面的方法 selector t
  • 从 XElement 中删除属性

    请考虑这个 XElement
  • 如何在 R 中创建没有情节的图例?

    这是一个艺术项目 我创建了一个包含 5 种不同颜色的许多点的散点图 我想创建一个与绘图完全分开的图例 因为它不在绘图上 也不在绘图旁边 而是在它自己的窗口中 因此我可以将图例保存为它自己的 pdf 文件 这样我就可以将我的情节和图例分开打印
  • 我应该如何管理 MVC Core 中的 DbContext 生命周期?

    来自文档 https learn microsoft com en us aspnet core fundamentals dependency injection 实体框架上下文should添加到服务容器中 使用Scoped寿命 如果您这
  • PyPDF2 复制后返回空白 PDF

    def EncryptPDFFiles password directory pdfFiles success 0 Get all PDF files from a directory for folderName subFolders f
  • 如何使整个 jqGrid 禁用/只读

    如何使整个 jqGrid 禁用 只读 我有一个带有逻辑 编辑部分 的页面 当用户选择要编辑的内容时显示该页面 并在用户完成编辑 保存或取消 时隐藏该页面 显示编辑部分时 我禁用了页面上的几个其他元素 我想禁用他们在 jqGrid 中单击的能
  • 在iOS上模仿截图flash动画

    我正在寻找一种复制按 home lock 时播放的 闪烁 动画的方法 有谁知道这个动画是否可用 在 iOS 设备上 当您按下 home lock 并且屏幕闪烁白色时 您会截取屏幕截图 你说的是这个效果吗 如果是这样 请尝试以下操作 Add
  • mysql查询where条件比较char字段与int 0的一些现象

    有一桌 root localhost test 05 35 05 gt desc t Field Type Null Key Default Extra id int 11 NO PRI NULL auto increment studio
  • Objective c 中的 UIButton 虚线下划线

    正常下划线有效 但点下划线似乎不起作用 UIButton btn UIButton buttonWithType UIButtonTypeCustom btn frame CGRectMake 100 10 300 300 NSMutabl
  • 如何强制Emma代码覆盖率报告忽略某些方法?

    有些方法 例如自动生成的 getter setter equals 和 toString 对于测试来说是微不足道的 但是 如果不将它们添加到测试类中 代码覆盖率 使用 Emma 计算 就会降低 并可能导致我们的系统构建崩溃 如何强制 emm
  • 无需导航到设置页面即可打开定位服务?颤动飞镖

    我们正在从 Flutter 迁移到 Flutter 我们用这个线程来 在 Flutter 中如何实现这一点 当前导航到设置的临时代码 Future getCurrentLocation async Position position try
  • 将中间件与 Golang Gorilla mux 子路由器结合使用

    如何将中间件应用到 Go 中大猩猩工具包 http www gorillatoolkit org 多路复用器子路由器 我有以下代码 router mux NewRouter StrictSlash true apiRouter router
  • Django - 一个视图中的多个模型(表)

    操作系统 Windows10 Python 3 7 4 姜戈 2 1 我想展示这个模型 像这样在此输入图像描述 https i stack imgur com 2UERg jpg 但我不知道 我怎样才能做到这一点 我尝试了三个月来解决这个问
  • R 热图中的颜色标签(文本)

    我正在尝试在 R 中制作一个热图 其中标签文本是彩色的 以指示数据点来自哪个组 我目前正在使用 heatmap 2 但很乐意使用另一个包 heatmap 2 data matrix data trace none dendrogram no
  • 在Qt中,如何正确实现委托?

    我遵循模型 视图 控制器范例 我很确定模型和视图是正确的 但我认为我的代表做错了一些事情 一切都 有效 除了第一次单击控件只是 点亮控件 而第二次单击与之交互之外 这是代表通常的实施方式吗 我的实现需要大量的构造和销毁 由scoped pt