首页 > 编程语言 >QT C++实现表头添加组件

QT C++实现表头添加组件

时间:2024-05-29 15:35:18浏览次数:13  
标签:QT int C++ 表头 QWidget Margins MyTableWidget MyHeaderView

QTableWidget在表头添加组件

QTableWidget的表头有一个类QHeaderView是专门处理表头的类,要在表头添加一个类似QCheckBox的组件需要重写一个类并继承QHeaderView。

QTableWidget中添加复选框并实现全选居中:

  • 自定义类MyHeaderView并继承QHeaderView
  • 自定义类MyTableWidget并继承QTableWidget

myheaderview.h

#ifndef MYHEADERVIEW_H
#define MYHEADERVIEW_H

#include <QHeaderView>
#include <Qt>

class MyHeaderView : public QHeaderView
{
    //Q_OBJECT:使用信号和槽函数必备的宏
public:
    struct Margins
    {
        int left;
        int right;
        int top;
        int buttom;

        Margins(int left = 2, int right = 2, int top = 2, int buttom = 2);  //通过构造函数设置默认参数
    };


    explicit MyHeaderView(Qt::Orientation orientation, QWidget *parent = nullptr);
    ~MyHeaderView();

    void SetItemWidget(int index, QWidget * widget);    //表头添加组件,比如checkbox、pushbutton
    void SetItemMargins(int index, Margins margins);    //设置边距

private:
    struct Item
    {
        QWidget * item;     //组件
        Margins margins;    //边缘

        Item(); //默认构造函数
    };

    QMap<int, Item> mItems;	//<key, data>
};

#endif // MYHEADERVIEW_H

myheaderview.cpp

#include "myheaderview.h"

MyHeaderView::MyHeaderView(Qt::Orientation orientation, QWidget * parent)
    : QHeaderView(orientation, parent)
{

}

MyHeaderView::~MyHeaderView()
{

}

void MyHeaderView::SetItemWidget(int index, QWidget *widget)
{
    widget->setParent(this);
    mItems[index].item = widget;
}

void MyHeaderView::SetItemMargins(int index, Margins margins)
{
    mItems[index].margins = margins;
}

MyHeaderView::Item::Item() : item(nullptr)
{
}

MyHeaderView::Margins::Margins(int left, int right, int top, int buttom) :
    left(left),
    right(right),
    top(top),
    buttom(buttom)
{
}

mytablewidget.h

#ifndef MYTABLEWIDGET_H
#define MYTABLEWIDGET_H
#include <QTableWidget>
#include "myheaderview.h"

class MyTableWidget : public QTableWidget
{
    //Q_OBJECT

public:
    MyTableWidget(QWidget * parent = nullptr);
    ~MyTableWidget();

    void SetHorizontalHeaderItemWidget(int column, QWidget * widget);	//表头添加组件
    void SetHorizontalHeaderItemMargins(int column, MyHeaderView::Margins margins);	//修改表头组件的边距

private:
    MyHeaderView *myheadview;
};

#endif // MYTABLEWIDGET_H

mytablewidget.cpp

#include "mytablewidget.h"

MyTableWidget::MyTableWidget(QWidget * parent)
    : QTableWidget(parent)
{
    myheadview = new MyHeaderView(Qt::Orientation::Horizontal, this);
    setHorizontalHeader(myheadview);        //这里有upcasting
}

MyTableWidget::~MyTableWidget()
{
    delete myheadview;
}

void MyTableWidget::SetHorizontalHeaderItemWidget(int column, QWidget *widget)
{
    myheadview->SetItemWidget(column, widget);
}

void MyTableWidget::SetHorizontalHeaderItemMargins(int column, MyHeaderView::Margins margins)
{
    myheadview->SetItemMargins(column, margins);
}

使用方法:

table->setColumnCount(5);
QCheckBox all_check = new QCheckBox("全选");
table->SetHorizontalHeaderItemWidget(0, all_check);     //在第0列添加一个QCheckBox

效果预览:

参考:https://stackoverflow.com/questions/27000484/add-custom-widgets-as-qtablewidget-horizontalheader

标签:QT,int,C++,表头,QWidget,Margins,MyTableWidget,MyHeaderView
From: https://www.cnblogs.com/qianxiaohan/p/18220392

相关文章

  • Java语言,MySQL数据库;SSM 心理咨询预约管理系统19086(免费领源码)计算机毕业设计项目推荐
    目 录摘要1绪论1.1背景及意义1.2研究现状1.3ssm框架介绍1.4论文结构与章节安排2 心理咨询预约管理系统系统分析2.1可行性分析2.1.1技术可行性分析2.1.2经济可行性分析2.1.3法律可行性分析2.2系统功能分析2.2.1功能性分析2.2.2非功能......
  • 【Qt秘籍】[005]-Qt第一次实战-运行
    一、如何创建文件?        当我们打开QtCreator,你会发现整个界面类目繁多。现在,让我们直接开始新建一个项目。1.点击左上角的“文件”==>点击“新建文件或项目”2.如图,选择“Application”==>“QtWifgetsapplication”==>“Choose...” 3.如图,选择填写名称和......
  • 从 .NET 到 C++:集合处理的思考
    1.IEnumerable与List的比较在.NET中,IEnumerable和List是两种常用的集合类型,它们有各自的适用场景:IEnumerable<T>:优点:惰性求值,仅在迭代时计算,适用于大数据集或流式数据处理。缺点:不能进行索引访问,没有直接的添加或移除元素的方法。List<T>:优点:支持索引访问,具备......
  • c++ 11 常用特性
     C++11常用特性总结 非原创,转载出处 http://www.cnblogs.com/feng-scC++11已经出来很久了,网上也早有很多优秀的C++11新特性的总结文章,在编写本博客之前,博主在工作和学习中学到的关于C++11方面的知识,也得益于很多其他网友的总结。本博客文章是在学习的基础上,加上博......
  • Qt 动画类(QPropertyAnimation)
    前言QPropertyAnimation是QT中的一个动画类,用于对目标对象的属性进行动画效果展示。该类继承自QAbstractAnimation类,使用起来非常方便和灵活。一、QPropertyAnimation类介绍QPropertyAnimation可以对任何QObject的子类的属性进行动画的展示,只要该属性是可写的,即存在set方......
  • c++ 设计模板
     ========一、设计模式的分类总体来说设计模式分为三大类创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。行为型模式,共十一种:策略模式、模板......
  • c++ new delete
     =====================delete是我们c++中的关键字,我们都知道它和new是配套使用的,有new就有delete不然会存在内存泄漏的问题。但是我们使用过delete的同学可能会发现delete有两种形式,一种是delete[],那这两个有什么区别呢?1、delete释放new分配的单个对象指针指向的......
  • C++中的vector
    C++中的vector一丶vector的介绍和使用1.vector的简单介绍2.vector的使用I.构造函数II.相关的迭代器III.空间容量以及大小IV.vector的增删查改3.迭代器失效的问题二丶vector的深度剖析和模拟实现1.使用memcpy拷贝出现的问题2.vector的模拟实现一丶vector的介绍和......
  • C++ - 结构体转cha*
    c语言结构体转cha*在C语言中,将结构体转换为char*通常意味着你想要获取结构体的内存表示,并将其视为字符数组。这种转换可以通过使用memcpy函数来实现。下面是一个简单的例子,展示了如何将结构体转换为char*: #include<stdio.h>#include<stdlib.h>#include<string.......
  • C++ - tcp网络传输如何发送结构体类型
    1、tcp网络传输如何发送结构体类型 在C++中,要通过TCP网络传输结构体类型,你需要将结构体序列化为字节流,然后在另一端反序列化。这里有一个简单的例子:#include<iostream>#include<cstring>#include<sys/socket.h>#include<netinet/in.h>#include<unistd.h>//假设......