Qt QTableView 表格内添加控件

书接上回,之前写了怎么在表格的表头添加复选框,Qt QHeaderView 添加复选框_师从名剑山的博客-CSDN博客。这次来写怎么给表格内添加控件。

往表格里添加控件主要有两种方法,第一种是使用代理,QItemDelegate,重载其createEditor这个函数,但是这个有个缺点,就是必须双击进入编辑模式才能修改,第二种方式就是setIndexWidget,这个要更好。

1. QItemDelegate

第一种方式是使用代理的方式,重载createEditor。之前一直知道QTableView有一种代理的方式,但是觉得这种方式很复杂,于是就基本没有用这个方法,最近刚好用到,就去了解了一下。

对于createEditor,我的理解是创建一个对表格的编辑,所以就需要双击之后才会显示,同样。这里参考QT的文档里对于这种方法的解释,同时在QT的示例spin box delegate中,有比较详尽的解释。

截取其中的一部分,对于createEditorsetEditorDatasetModelData这几个函数的用处。

createEditor: 创建一个编辑器小部件,并将其直接显示在项目的顶部。

setEditorData: 用来自model里的数据来填充editor。

setModelData: 用editor的数据来填充model。

代码如下:

delegate.h

#ifndef DELEGATE_H
#define DELEGATE_H #include <QItemDelegate>
#include <QCheckBox>
#include <QApplication> class Delegate : public QItemDelegate
{
public:
Delegate(QObject* parent = nullptr); void paint(QPainter *painter, const QStyleOptionViewItem &option,
const QModelIndex &index) const;
QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const; QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option,
const QModelIndex &index) const;
// void setEditorData(QWidget *editor, const QModelIndex &index) const;
// void setModelData(QWidget *editor, QAbstractItemModel *model,
// const QModelIndex &index) const;
}; #endif // DELEGATE_H

delegate.cpp

#include "delegate.h"

Delegate::Delegate(QObject *parent)
{ } void Delegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
QItemDelegate::paint(painter, option, index);
} QSize Delegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const
{
QItemDelegate::sizeHint(option, index);
} QWidget *Delegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
if (index.isValid() && index.column() == 0) {
QCheckBox* checkBox = new QCheckBox(parent);
checkBox->installEventFilter(const_cast<Delegate*> (this));
return checkBox;
} else {
return QItemDelegate::createEditor(parent, option, index);
}
}

由于此处添加的是一个复选框,所以没有重载setEditorDatasetModelData这两个函数,只是重载了createEditor这个函数。

具体的效果图如下:

2. setIndexWidget

第二种方式是使用这个API : void QAbstractItemView::setIndexWidget(const QModelIndex &index, QWidget *widget)

index代表单元格所在的下标,widget代表你需要添加的窗口。

代码如下:

tableviewModel = new QStandardItemModel;
ui->tableView->setModel(tableviewModel);
QStringList headerList;
headerList<<"姓名"<<"性别"<<"年龄";
tableviewModel->setHorizontalHeaderLabels(headerList);
tableviewModel->setItem(0,1,new QStandardItem("张三"));
tableviewModel->setItem(1,1,new QStandardItem("李四"));
tableviewModel->setItem(2,1,new QStandardItem("王二")); QStandardItem* item = new QStandardItem();
QCheckBox *checkBox = new QCheckBox(); tableviewModel->setItem(0, 0, item);
ui->tableView->setIndexWidget(tableviewModel->index(0, 0), checkBox );

但是这里有一个缺点,如果直接插入进去,会出现没办法控制这个控件的位置,这个控件默认在最左边,如下图:

3. setIndexWidget + setLayout

根据上面出现的情况,可以先创建一个widget,然后再创建一个布局,在把你需要添加的控件加到这个布局里去,然后再根据你的需求来布局。

代码如下:

    tableviewModel = new QStandardItemModel;
ui->tableView->setModel(tableviewModel);
QStringList headerList;
headerList<<"姓名"<<"性别"<<"年龄";
tableviewModel->setHorizontalHeaderLabels(headerList);
tableviewModel->setItem(0,1,new QStandardItem("张三"));
tableviewModel->setItem(1,1,new QStandardItem("李四"));
tableviewModel->setItem(2,1,new QStandardItem("王二")); QStandardItem* item = new QStandardItem();
QWidget* checkWidget = new QWidget();
QHBoxLayout* hLayout = new QHBoxLayout;
QCheckBox *checkBox = new QCheckBox(checkWidget);
hLayout->setContentsMargins(10, 0, 0, 0);
hLayout->addWidget(checkBox);
checkWidget->setLayout(hLayout); tableviewModel->setItem(0, 0, item);
ui->tableView->setIndexWidget(tableviewModel->index(0, 0), checkWidget);

效果图如下:

Qt QTableView 表格内添加控件的更多相关文章

  1. qt 在ui界面添加控件后在cpp文件中无法调用?

    问题:qt 在ui界面添加控件后在cpp文件中无法调用? 解决方法:在build选项中选择“重新build项目”,再次在cpp中调用添加的控件发现可以调用了. 还有一种情况导致添加控件后无法调用,就是 ...

  2. Qt在表格中加入控件

    任务:使用QTableWidget动态生成表格,在每行的某两列中加入QComboBox下拉框控件和QPushButton按钮控件 有添加,删除,编辑功能,每行的按钮可以浏览文件夹并选择文件 1.新建一 ...

  3. Qt 之容器内的控件全屏

    m_label = new QLabel(); ui->stackedWidget->addWidget(m_label); ui->stackedWidget->setCur ...

  4. 给jquery-validation插件添加控件的验证回调方法

    jquery-validation.js在前端验证中使用起来非常方便,提供的功能基本上能满足大部分验证需求,例如:1.内置了很多常用的验证方法:2.可以自定义错误显示信息:3.可以自定义错误显示位置: ...

  5. WinForm用户控件、动态创建添加控件、timer控件--2016年12月12日

    好文要顶 关注我 收藏该文 徐淳 关注 - 1 粉丝 - 3       0 0     用户控件: 通过布局将多个控件整合为一个控件,根据自己的需要进行修改,可对用户控件内的所有控件及控件属性进行修 ...

  6. winform导入导出excel,后台动态添加控件

    思路: 导入: 1,初始化一个OpenFileDialog类 (OpenFileDialog fileDialog = new OpenFileDialog();) 2, 获取用户选择文件的后缀名(s ...

  7. VC中动态添加控件

    VC中动态添加控件 动态控件是指在需要时由Create()创建的控件,这与预先在对话框中放置的控件是不同的. 一.创建动态控件: 为了对照,我们先来看一下静态控件的创建. 放置静态控件时必须先建立一个 ...

  8. 《Programming WPF》翻译 第3章 3.内嵌控件

    原文:<Programming WPF>翻译 第3章 3.内嵌控件 WPF提供了一系列内嵌控件.其中大多数符合标准的你已经熟悉的Windows控件类型.注意到没有一个是包装在旧的Win32 ...

  9. Android 应用内悬浮控件实践总结

    在工作中遇到一个需求,需要在整个应用的上层悬浮显示控件,目标效果如下图: 首先想到的是申请悬浮窗权限,OK~ 打开搜索引擎,映入眼帘的并不是如何申请,而是“Android 悬浮窗权限各机型各系统适配大 ...

随机推荐

  1. php 23种设计模型 - 代理模式

    代理模式(Proxy) 在代理模式(Proxy Pattern)中,一个类代表另一个类的功能.这种类型的设计模式属于结构型模式. 在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口. 介 ...

  2. yum 安装的历史与撤销(yum history undo )

    我们可以使用yum history 来查看yum的历史记录 想撤销安装则输入 yum history undo <ID号> 即可撤销yum的安装/升级

  3. 顺序表的插入和删除(基于c语言)

    插入:在下标p处插入数据x:返回是否成功(0/1) 几个注意点:1.还能否插入数据:2.给的下标p是否是错误的以及p的范围:3.移动时的易错点(从下标大的元素开始):4.n与palist->n; ...

  4. DDD 领域驱动设计之面向对象思想

    面向对象 面向对象是一种对世界理解和抽象的方法.那么对象是什么呢? 对象是对世界的理解和抽象,世界又代称为万物.理解世界是比较复杂的,但是世界又是由事物组成的. 正是这样的一种关系,认识事物是极其重要 ...

  5. kubernetes关于证书配置得问题总结

    总结证书配置 1.证书首先分为两种配置方式, 1) 一种是在集群中配置 2) 一种是在上游负载均衡中配置. 1)https证书在集群中配置,并域名直接解析到集群的ingress-nginx-contr ...

  6. class文件和java文件区别

  7. java字节流和字符流,以及java文件操作

    A.首先说字节流:1.字节流在操作的时候不会用到缓冲区(也就是内存)2.字节流可用于任何类型的对象,包括二进制对象3.字节流处理单元为1个字节,操作字节和字节数组.InputStream是所有字节输入 ...

  8. select poll和epoll

    select poll epoll都是IO多路复用机制.这里的复用其实可以理解为复用的线程,即一个(或者较少的)线程完成多个IO的读写.这里总结下这三个函数的区别. 1 select 1.1 sele ...

  9. ThreadLocal 是什么?有什么用?

    ThreadLocal 是一个本地线程副本变量工具类.主要用于将私有线程和该线程存放的副本对象做一个映射,各个线程之间的变量互不干扰,在高并发场景下,可以实现无状态的调用,特别适用于各个线程依赖不通的 ...

  10. Linux Yum仓库源配置

    Yum概念:Yum软件仓库的作用是为了进一步简化RPM管理软件的难度以及自动分析所需软件包及其依赖关系的技术 Yum配置仓库源放置位置:/etc/yum.repo.d/ :配置文件需以 .repo 结 ...