Qt QTableView 表格内添加控件
Qt QTableView 表格内添加控件
书接上回,之前写了怎么在表格的表头添加复选框,Qt QHeaderView 添加复选框_师从名剑山的博客-CSDN博客。这次来写怎么给表格内添加控件。
往表格里添加控件主要有两种方法,第一种是使用代理,QItemDelegate
,重载其createEditor
这个函数,但是这个有个缺点,就是必须双击进入编辑模式才能修改,第二种方式就是setIndexWidget
,这个要更好。
1. QItemDelegate
第一种方式是使用代理的方式,重载createEditor
。之前一直知道QTableView有一种代理的方式,但是觉得这种方式很复杂,于是就基本没有用这个方法,最近刚好用到,就去了解了一下。
对于createEditor
,我的理解是创建一个对表格的编辑,所以就需要双击之后才会显示,同样。这里参考QT的文档里对于这种方法的解释,同时在QT的示例spin box delegate
中,有比较详尽的解释。
截取其中的一部分,对于createEditor
、setEditorData
和setModelData
这几个函数的用处。
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);
}
}
由于此处添加的是一个复选框,所以没有重载setEditorData
和setModelData
这两个函数,只是重载了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 表格内添加控件的更多相关文章
- qt 在ui界面添加控件后在cpp文件中无法调用?
问题:qt 在ui界面添加控件后在cpp文件中无法调用? 解决方法:在build选项中选择“重新build项目”,再次在cpp中调用添加的控件发现可以调用了. 还有一种情况导致添加控件后无法调用,就是 ...
- Qt在表格中加入控件
任务:使用QTableWidget动态生成表格,在每行的某两列中加入QComboBox下拉框控件和QPushButton按钮控件 有添加,删除,编辑功能,每行的按钮可以浏览文件夹并选择文件 1.新建一 ...
- Qt 之容器内的控件全屏
m_label = new QLabel(); ui->stackedWidget->addWidget(m_label); ui->stackedWidget->setCur ...
- 给jquery-validation插件添加控件的验证回调方法
jquery-validation.js在前端验证中使用起来非常方便,提供的功能基本上能满足大部分验证需求,例如:1.内置了很多常用的验证方法:2.可以自定义错误显示信息:3.可以自定义错误显示位置: ...
- WinForm用户控件、动态创建添加控件、timer控件--2016年12月12日
好文要顶 关注我 收藏该文 徐淳 关注 - 1 粉丝 - 3 0 0 用户控件: 通过布局将多个控件整合为一个控件,根据自己的需要进行修改,可对用户控件内的所有控件及控件属性进行修 ...
- winform导入导出excel,后台动态添加控件
思路: 导入: 1,初始化一个OpenFileDialog类 (OpenFileDialog fileDialog = new OpenFileDialog();) 2, 获取用户选择文件的后缀名(s ...
- VC中动态添加控件
VC中动态添加控件 动态控件是指在需要时由Create()创建的控件,这与预先在对话框中放置的控件是不同的. 一.创建动态控件: 为了对照,我们先来看一下静态控件的创建. 放置静态控件时必须先建立一个 ...
- 《Programming WPF》翻译 第3章 3.内嵌控件
原文:<Programming WPF>翻译 第3章 3.内嵌控件 WPF提供了一系列内嵌控件.其中大多数符合标准的你已经熟悉的Windows控件类型.注意到没有一个是包装在旧的Win32 ...
- Android 应用内悬浮控件实践总结
在工作中遇到一个需求,需要在整个应用的上层悬浮显示控件,目标效果如下图: 首先想到的是申请悬浮窗权限,OK~ 打开搜索引擎,映入眼帘的并不是如何申请,而是“Android 悬浮窗权限各机型各系统适配大 ...
随机推荐
- CentOS8时间同步
CentOS8中默认已经不再支持ntpd软件包,同时也无法通过官方软件仓库安装, CentOS8上使用Chrony配置NTP服务器,用于同步时间. 它有两个程序,chrony和chronyd, chr ...
- Centos7 使用Docker安装rocket.chat聊天工具
镜像下载.域名解析.时间同步请点击阿里云开源镜像站 下载安装 Rocket.Chat 目前最新的版本为 4.0.1,可以通过手动或者容器的方式安装.这里我推荐使用容器,部署过程会方便不少. 如果要用容 ...
- 【Calculate】Calculate Linux安装操作记录
镜像下载.域名解析.时间同步请点击 阿里云开源镜像站 一.Calculate简介 Calculate Linux 是一个基于 Gentoo的发行版本. Calculate 目录服务器 (CDS) 是一 ...
- nginx配置限制同一个ip的访问频率方法
1.在nginx.conf里的http{}里加上如下代码: limit_conn_zone $binary_remote_addr zone=perip:10m; limit_conn_zone ...
- bzoj5130 字符串的周期(kmp,最小表示法)
bzoj5130 字符串的周期(kmp,最小表示法) bzoj 题解时间 m很大,n很小. 周期很容易求,就是kmp之后n-fail[n]. 之后对于枚举所有的字符串用最小表示法,暴力搜索. 能过就完 ...
- Java并发机制(1)--线程状态与方法(转)
Java并发编程:Thread类的使用 个人总结:参考:博客园-海子-http://www.cnblogs.com/dolphin0520/p/3920357.html 参考:https://blog ...
- 用 wait-notify 写一段代码来解决生产者-消费者问题?(答案)
请参考答案中的示例代码.只要记住在同步块中调用 wait() 和 notify()方法,如果阻塞,通过循环来测试等待条件.
- ElasticSearch-学习笔记01-docker安装
安装ElasticSearch docker 安装请参考: https://www.cnblogs.com/youxiu326/p/docker-01.html docker run -d --nam ...
- 企业流程再造(BPR)--系统重构
企业流程再造(BPR) 企业流程:指生产或服务过程中一连串活动的工作流程 企业流程再造:对企业流程所进行的根本性的在思考和彻底的再设计,以使企业的速度,质量,服务和成本等关键业绩指标获得根本性的改善
- 一个看一次就永远不会忘的windows环境开发小技巧
前言:本人前端开发,在日常开发中需要打开多个窗口进行开发,如:本地服务窗口,ide工具,设计图,prd文档,浏览器,浏览器调试工具: 如此多的窗口同时打开并且时常需要查看的情况下,遗憾的是,即使我是双 ...