QTableView的一行里添加两个按钮

2024-08-25 05:20

本文主要是介绍QTableView的一行里添加两个按钮,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

我是光明正大地抄,作者说的欢迎转载
作者:李鹏
出处:http://www.cnblogs.com/li-peng/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

链接:https://pan.xunlei.com/s/VO540QHTSoXJtFfL5J3xxtT6A1?pwd=krff#
复制这段内容后打开手机迅雷App,查看更方便

看一下列的效果
在这里插入图片描述
看一下添加两个按钮的效果:
点击第一个按钮弹出 but1 +当前列
在这里插入图片描述

点击第二个按钮弹出but2 + 当前行
在这里插入图片描述
下面是主要实现

继承自 QItemDelegate

主要是实现 了它的painter方法,把两个自定义的按钮绘制到视图并保存

还有editorEvent事件,用来处理点击事件,在点击时我们算一下鼠标的坐标在哪个按钮下,

再处理相应的点击事件


#ifndef BUTTONDELEGATE_H
#define BUTTONDELEGATE_H#include <QItemDelegate>class ButtonDelegate : public QItemDelegate
{Q_OBJECT
public:explicit ButtonDelegate(QObject *parent = 0);void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const;bool editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index);signals:public slots:private:void showMsg(QString str);private:typedef QMap<QModelIndex, QPair<QStyleOptionButton*, QStyleOptionButton*>* >  collButtons;collButtons m_btns;};#endif // BUTTONDELEGATE_H

按钮的具体实现

#include "buttondelegate.h"#include <QApplication>
#include <QMouseEvent>
#include <QMessageBox>
#include <QPainter>
#include <QStyleOption>
#include <QDesktopWidget>ButtonDelegate::ButtonDelegate(QObject *parent) :QItemDelegate(parent)
{
}void ButtonDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{QPair<QStyleOptionButton*, QStyleOptionButton*>* buttons = m_btns.value(index);if (!buttons) {QStyleOptionButton* button1 = new QStyleOptionButton();//button1->rect = option.rect.adjusted(4, 4, -(option.rect.width() / 2 + 4) , -4); //button1->text = "X";button1->state |= QStyle::State_Enabled;QStyleOptionButton* button2 = new QStyleOptionButton();//button2->rect = option.rect.adjusted(button1->rect.width() + 4, 4, -4, -4);button2->text = "Y";button2->state |= QStyle::State_Enabled;buttons =new  QPair<QStyleOptionButton*, QStyleOptionButton*>(button1, button2);(const_cast<ButtonDelegate *>(this))->m_btns.insert(index, buttons);}buttons->first->rect = option.rect.adjusted(4, 4, -(option.rect.width() / 2 + 4) , -4); //buttons->second->rect = option.rect.adjusted(buttons->first->rect.width() + 4, 4, -4, -4);painter->save();if (option.state & QStyle::State_Selected) {painter->fillRect(option.rect, option.palette.highlight());}painter->restore();QApplication::style()->drawControl(QStyle::CE_PushButton, buttons->first, painter);QApplication::style()->drawControl(QStyle::CE_PushButton, buttons->second, painter);
}bool ButtonDelegate::editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index)
{if (event->type() == QEvent::MouseButtonPress) {QMouseEvent* e =(QMouseEvent*)event;if (m_btns.contains(index)) {QPair<QStyleOptionButton*, QStyleOptionButton*>* btns = m_btns.value(index);if (btns->first->rect.contains(e->x(), e->y())) {btns->first->state |= QStyle::State_Sunken;}else if(btns->second->rect.contains(e->x(), e->y())) {btns->second->state |= QStyle::State_Sunken;}}}if (event->type() == QEvent::MouseButtonRelease) {QMouseEvent* e =(QMouseEvent*)event;if (m_btns.contains(index)) {QPair<QStyleOptionButton*, QStyleOptionButton*>* btns = m_btns.value(index);if (btns->first->rect.contains(e->x(), e->y())) {btns->first->state &= (~QStyle::State_Sunken);showMsg(tr("btn1 column %1").arg(index.column()));} else if(btns->second->rect.contains(e->x(), e->y())) {btns->second->state &= (~QStyle::State_Sunken);showMsg(tr("btn2 row %1").arg(index.row()));}}}
}void ButtonDelegate::showMsg(QString str)
{QMessageBox msg;msg.setText(str);msg.exec();
}

好了自定义按钮处理完了

我们建一个Table添加一些数据

#ifndef TABLEMODEL_H
#define TABLEMODEL_H#include <QAbstractTableModel>class TableModel : public QAbstractTableModel
{Q_OBJECT
public:explicit TableModel(QObject *parent = 0);int rowCount(const QModelIndex &parent) const;int columnCount(const QModelIndex &parent) const;QVariant data(const QModelIndex &index, int role) const;Qt::ItemFlags flags(const QModelIndex &index) const;void setHorizontalHeader(const QStringList& headers);QVariant headerData(int section, Qt::Orientation orientation, int role) const;void setData(const QVector<QStringList>& data);QVector<QStringList>& DataVector() {return m_data;}~TableModel(void);signals:public slots:private:QStringList m_HorizontalHeader;QVector<QStringList> m_data;
};#endif // TABLEMODEL_H

model的实现 并添加一些数据

#include "tablemodel.h"TableModel::TableModel(QObject *parent) :QAbstractTableModel(parent)
{
}TableModel::~TableModel()
{}int TableModel::rowCount(const QModelIndex &parent) const
{return m_data.size();
}int TableModel::columnCount(const QModelIndex &parent) const
{return m_HorizontalHeader.count();
}QVariant TableModel::data(const QModelIndex &index, int role) const
{if (!index.isValid())return QVariant();if (role == Qt::DisplayRole) {int ncol = index.column();int nrow =  index.row();QStringList values = m_data.at(nrow);if (values.size() > ncol)return values.at(ncol);elsereturn QVariant();}return QVariant();
}Qt::ItemFlags TableModel::flags(const QModelIndex &index) const
{if (!index.isValid())return Qt::NoItemFlags;Qt::ItemFlags flag = QAbstractItemModel::flags(index);// flag|=Qt::ItemIsEditable // 设置单元格可编辑,此处注释,单元格无法被编辑return flag;
}void TableModel::setHorizontalHeader(const QStringList &headers)
{m_HorizontalHeader =  headers;
}QVariant TableModel::headerData(int section, Qt::Orientation orientation, int role) const
{if (role == Qt::DisplayRole && orientation == Qt::Horizontal) {return m_HorizontalHeader.at(section);}return QAbstractTableModel::headerData(section, orientation, role);
}void TableModel::setData(const QVector<QStringList> &data)
{m_data = data;
}

TableView的实现,和model关联

#ifndef TABLEVIEW_H
#define TABLEVIEW_H#include <QTableView>
#include "tablemodel.h"
#include "buttondelegate.h"class TableView : public QTableView
{Q_OBJECT
public:explicit TableView(QWidget *parent = 0);TableModel* tableModel() {return m_model;}~TableView();signals:public slots:private:void iniData();private:TableModel *m_model;ButtonDelegate *m_buttonDelegate;};#endif // TABLEVIEW_H
#include "tableview.h"#include "tablemodel.h"
#include "buttondelegate.h"TableView::TableView(QWidget *parent) :QTableView(parent)
{iniData();
}TableView::~TableView()
{delete m_model;
}void TableView::iniData()
{m_model = new TableModel();this->setModel(m_model);QStringList headers;headers << "Id" << "Progress";m_model->setHorizontalHeader(headers);QVector<QStringList> data;data.append(QStringList() << "1" << "22");data.append(QStringList() << "2" << "32");data.append(QStringList() << "3" << "2");data.append(QStringList() << "4" << "80");data.append(QStringList() << "5" << "40");m_model->setData(data);m_buttonDelegate = new ButtonDelegate(this);this->setItemDelegateForColumn(1, m_buttonDelegate);emit m_model->layoutChanged();this->setColumnWidth(1, 500);
}

这就完成了

我们看一下调用

this->resize(800, 600);TableView *tv = new TableView(this);QVBoxLayout* layout = new QVBoxLayout();layout->addWidget(tv);this->setLayout(layout);

这篇关于QTableView的一行里添加两个按钮的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/1104655

相关文章

C语言实现两个变量值交换的三种方式

《C语言实现两个变量值交换的三种方式》两个变量值的交换是编程中最常见的问题之一,以下将介绍三种变量的交换方式,其中第一种方式是最常用也是最实用的,后两种方式一般只在特殊限制下使用,需要的朋友可以参考下... 目录1.使用临时变量(推荐)2.相加和相减的方式(值较大时可能丢失数据)3.按位异或运算1.使用临时

java两个List的交集,并集方式

《java两个List的交集,并集方式》文章主要介绍了Java中两个List的交集和并集的处理方法,推荐使用Apache的CollectionUtils工具类,因为它简单且不会改变原有集合,同时,文章... 目录Java两个List的交集,并集方法一方法二方法三总结java两个List的交集,并集方法一

Vue中动态权限到按钮的完整实现方案详解

《Vue中动态权限到按钮的完整实现方案详解》这篇文章主要为大家详细介绍了Vue如何在现有方案的基础上加入对路由的增、删、改、查权限控制,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、数据库设计扩展1.1 修改路由表(routes)1.2 修改角色与路由权限表(role_routes)二、后端接口设计

Python如何计算两个不同类型列表的相似度

《Python如何计算两个不同类型列表的相似度》在编程中,经常需要比较两个列表的相似度,尤其是当这两个列表包含不同类型的元素时,下面小编就来讲讲如何使用Python计算两个不同类型列表的相似度吧... 目录摘要引言数字类型相似度欧几里得距离曼哈顿距离字符串类型相似度Levenshtein距离Jaccard相

使用Navicat工具比对两个数据库所有表结构的差异案例详解

《使用Navicat工具比对两个数据库所有表结构的差异案例详解》:本文主要介绍如何使用Navicat工具对比两个数据库test_old和test_new,并生成相应的DDLSQL语句,以便将te... 目录概要案例一、如图两个数据库test_old和test_new进行比较:二、开始比较总结概要公司存在多

C#比较两个List集合内容是否相同的几种方法

《C#比较两个List集合内容是否相同的几种方法》本文详细介绍了在C#中比较两个List集合内容是否相同的方法,包括非自定义类和自定义类的元素比较,对于非自定义类,可以使用SequenceEqual、... 目录 一、非自定义类的元素比较1. 使用 SequenceEqual 方法(顺序和内容都相等)2.

锐捷和腾达哪个好? 两个品牌路由器对比分析

《锐捷和腾达哪个好?两个品牌路由器对比分析》在选择路由器时,Tenda和锐捷都是备受关注的品牌,各自有独特的产品特点和市场定位,选择哪个品牌的路由器更合适,实际上取决于你的具体需求和使用场景,我们从... 在选购路由器时,锐捷和腾达都是市场上备受关注的品牌,但它们的定位和特点却有所不同。锐捷更偏向企业级和专

两个月冲刺软考——访问位与修改位的题型(淘汰哪一页);内聚的类型;关于码制的知识点;地址映射的相关内容

1.访问位与修改位的题型(淘汰哪一页) 访问位:为1时表示在内存期间被访问过,为0时表示未被访问;修改位:为1时表示该页面自从被装入内存后被修改过,为0时表示未修改过。 置换页面时,最先置换访问位和修改位为00的,其次是01(没被访问但被修改过)的,之后是10(被访问了但没被修改过),最后是11。 2.内聚的类型 功能内聚:完成一个单一功能,各个部分协同工作,缺一不可。 顺序内聚:

C# 防止按钮botton重复“点击”的方法

在使用C#的按钮控件的时候,经常我们想如果出现了多次点击的时候只让其在执行的时候只响应一次。这个时候很多人可能会想到使用Enable=false, 但是实际情况是还是会被多次触发,因为C#采用的是消息队列机制,这个时候我们只需要在Enable = true 之前加一句 Application.DoEvents();就能达到防止重复点击的问题。 private void btnGenerateSh

2024年AMC10美国数学竞赛倒计时两个月:吃透1250道真题和知识点(持续)

根据通知,2024年AMC10美国数学竞赛的报名还有两周,正式比赛还有两个月就要开始了。计划参赛的孩子们要记好时间,认真备考,最后冲刺再提高成绩。 那么如何备考2024年AMC10美国数学竞赛呢?做真题,吃透真题和背后的知识点是备考AMC8、AMC10有效的方法之一。通过做真题,可以帮助孩子找到真实竞赛的感觉,而且更加贴近比赛的内容,可以通过真题查漏补缺,更有针对性的补齐知识的短板。