QTableView设置表格左上的文字_qq303103757的博客-程序员秘密

技术标签: QT  qt  

设置文字和设置按钮或者其他控件都是可以的
QTableView设置表格左上的文字主要方法是继承后通过绘制在左上角
在这里插入图片描述
首先写一个类继承QTableView
class GCornerTableView : public QTableView
GCornerTableView.h

#ifndef GCORNERTABLEVIEW_H
#define GCORNERTABLEVIEW_H

#include <QPainter>
#include <QTableView>
#include <QAbstractButton>

class GCornerTableView : public QTableView
{
    Q_OBJECT

public:
    explicit GCornerTableView(QWidget *parent = 0);
    void setCornerButtonText(const QString &text);
    void setCornerTextAlignment(Qt::Alignment align);

private:
    QString m_cornerButtonText;

    Q_DECLARE_PRIVATE(QTableView)
};


class GTableCornerButton : public QAbstractButton
{
    Q_OBJECT

public:
    GTableCornerButton(QWidget *parent = 0)
        : QAbstractButton(parent)
    {

    }

    void paintEvent(QPaintEvent*)
    {
        QStyleOptionHeader opt;
        opt.initFrom(this);
        QStyle::State state = QStyle::State_None | QStyle::State_Raised;

        if (isEnabled())
        {
            state |= QStyle::State_Enabled;
        }

        if (isActiveWindow())
        {
            state |= QStyle::State_Active;
        }

        if (isDown())
        {
            state |= QStyle::State_Sunken;
        }

        opt.state = state;
        opt.text = m_text;
        opt.rect = rect();
        opt.position = QStyleOptionHeader::OnlyOneSection;
        opt.textAlignment = m_align;
        QPainter painter(this);
        style()->drawControl(QStyle::CE_Header, &opt, &painter, this);
    }

    void setText(const QString &text) {m_text = text;}
    void setAlignment(Qt::Alignment align) {m_align = align;}

private:
    QString m_text;
    Qt::Alignment m_align;
};

#endif // GCORNERTABLEVIEW_H

GCornerTableView.cpp

#include "gcornertableview.h"

#include <QHeaderView>
#include <QFontMetrics>
#include <private/qtableview_p.h>

GCornerTableView::GCornerTableView(QWidget *parent)
    : QTableView(parent)
{
    Q_D(QTableView);

    disconnect(d->cornerWidget, SIGNAL(clicked()), this, SLOT(selectAll()));
    delete d->cornerWidget;
    GTableCornerButton *btn = new GTableCornerButton(this);
    btn->setAlignment(Qt::AlignCenter);
    d->cornerWidget = btn;
    d->cornerWidget->setFocusPolicy(Qt::NoFocus);
    d->cornerWidget->setFont(d->verticalHeader->font());//cornerbutton used for verticalheader
//    QObject::connect(d->cornerWidget, SIGNAL(clicked()), this, SLOT(selectAll()));
}

void GCornerTableView::setCornerButtonText(const QString &text)
{
    Q_D(QTableView);

    m_cornerButtonText = text;
    GTableCornerButton *btn = static_cast<GTableCornerButton *>(d->cornerWidget);
    Q_ASSERT(btn);
    btn->setText(m_cornerButtonText);

    QFontMetrics metrics(btn->font());
    int width = metrics.width(m_cornerButtonText);
    int height = metrics.height();
    d->verticalHeader->setMinimumWidth(width + metrics.maxWidth());
    d->verticalHeader->setMinimumHeight(height + metrics.maxWidth());
    d->verticalHeader->setDefaultAlignment(Qt::AlignCenter);
}

void GCornerTableView::setCornerTextAlignment(Qt::Alignment align)
{
    Q_D(QTableView);

    GTableCornerButton *btn = static_cast<GTableCornerButton *>(d->cornerWidget);
    Q_ASSERT(btn);
    btn->setAlignment(align);
    btn->repaint();
}

然后是在mainwindow中使用测试

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "GCornerTableView.h"

#include <QVBoxLayout>
#include <QStandardItemModel>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    GCornerTableView *pCornerTableView = new GCornerTableView(this);

    QStandardItemModel *pModel = new QStandardItemModel(10, 10, pCornerTableView);
    pCornerTableView->setModel(pModel);

    pCornerTableView->setCornerButtonText(QStringLiteral("测试"));

    QVBoxLayout* pLayout = new QVBoxLayout();
    pLayout->addWidget(pCornerTableView);

    ui->centralWidget->setLayout(pLayout);
}

MainWindow::~MainWindow()
{
    delete ui;
}

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/cqltbe131421/article/details/99696921

智能推荐

mysql中间件proxysql实现mysql读写分离_百慕倾君的博客-程序员秘密

1. mysql实现读写分离的方式mysql 实现读写分离的方式有以下几种:程序修改mysql操作,直接和数据库通信,简单快捷的读写分离和随机的方式实现的负载均衡,权限独立分配,需要开发人员协助。amoeba,直接实现读写分离和负载均衡,不用修改代码,有很灵活的数据解决方案,自己分配账户,和后端数据库权限管理独立,权限处理不够灵活。mysql-proxy,直接实现读写分离和负载均衡,不用修改代码,master和slave用一样的帐号,效率低mycat中间件proxysql中间件(推荐使用)

传输层UDP/TCP协议_两片空白的博客-程序员秘密

前言 负责数据能够从发送端传输到接收端。一.五元组 1.1 概念 端口号:标识另一台主机上的一个进程。 端口号如何找到进程?内核实现通过哈希算法,端口号对应进程PID。 在TCP/IP协议中,用"源IP","目的IP","源端口号","目的端口号","协议号",这五元组来标识一个通信。 源IP:发送数据的主机IP 目的IP:最终接收数据主机IP 源端口号:发...

使用Visual C++进行串口通信编程 _yuntongsf的博客-程序员秘密

 利用Visual C++在windows环境下设计异步串行通信程序可以使用不同的方法。一种方法可以使用windows系统提供的串行口API函数;另一种方法可以直接使用Microsoft公司提供的ActiveX控件MSCOMM.OCX。利用MSCOMM.OCX控件进行串行口程序设计相对比较简单,只要对该控件的属性、事件和方法进行设置和操作,就能完成简单的串行通信功能。而直接使用windows系

Tomcat 或者 Nginx 配置 Https ~ 域名 ssl证书、https_Dazer007的博客-程序员秘密

Tomcat 或者 Nginx 配置 Https现在的网站慢慢都流行使用https访问,比较安全,使用https只要一个证书即可,ip地址、域名地址都不需要改变,添加https证书支持,访问地址会默认添加上面https;如何为nginx配置https(免费证书) tomcat https配置方法(免费证书)

Java正确关闭多个文件流_java多个流关闭_精益的态度成就不一样的人生的博客-程序员秘密

用Java操作文件时,对一个文件,难免会构造多个流,那么怎样合理的关闭多个流呢?其实只需要关闭最后打开的一个流就行了。参考:http://www.javapractices.com/topic/TopicAction.do?Id=8但如果对应不同的文件,那么则需要都关闭。...

详解蓝牙标准中的Pi/4-DQPSK调制_gfsk 星座图_yunfei2013的博客-程序员秘密

蓝牙是一种被广泛应用的无线通信标准,工作在2.4GHz-2.4835GHz频段范围,所用的调制方式有三种:GFSK,pi/4-DQPSK和8DPSK。今天就来介绍下pi/4-DQPSK调制。BPSK 首先从最简单的BPSK讲起,BPSK就是二进制相移键控只有两种相位状态,并且两种相位状态差180°。其星座图如下: BPSK信号只有I路,若将Q路也发送额外信息则频谱效率可以加倍,于是就有了QP

随便推点

空指针、零指针、野指针_如果数组里都为0是空指针吗_a1232345的博客-程序员秘密

1. 空指针、NULL指针、零指针1.1什么是空指针常量0、0L、'\0'、3 - 3、0 * 17 (它们都是“integer constant expression”)以及 (void*)0 (我觉得(void*)0应该算是一个空指针吧,更恰当一点)等都是空指针常量(注意 (char*) 0 不叫空指针常量,只是一个空指针值)。至于系统选取哪种形式作为空指针常量使用,则是实现相关的。一

iOS Swift之RxSwift初探_ios rxswift_风雨「83」的博客-程序员秘密

Podfile文件target中添加一下代码并pod update 、、或者手动下载拖出代码模块。例如,先通过用户名密码取得 Token 然后通过 Token 取得用户信息,你不需要去管理观察者的生命周期,这样你就有更多精力去关注业务逻辑。回调也变得十分简单,错误和返回结果分离,逻辑更加清晰。例如,需要将两个网络请求合并成一个,通过Rx使得代码逻辑清晰可见。这样处理代码更加简洁。

Git和Github的区别与操作简介_相思寄清风的博客-程序员秘密

文章目录1,常见版本管理工具介绍 及 版本工具作用2,git、GitHub和SVN比较3,本地git基本使用命令4,使用git操作GitHub5,配置win10当前用户对GitHub所有项目有权限(git push不必输入密码)6,配置Linux当前用户对GitHub指定项目有权限(git push不必输入密码)7,git分支管理(创建&amp;合并分支)8,git stash (bug分支) 9,多人协作开发10,vim .gitignore (指定那些文件不需要git管理)11,

设置date输入框的默认值为当前时间_=day(@dateval)_517号刺猬的博客-程序员秘密

            //设置日期默认值为当天            var nowDate=new Date();                 var nowMonth=nowDate.getMonth()+1;   //月份和日期若为小于10的数要做处理            var nowDay=nowDate.getDate();             if((nowDat...

实验一:使用VMware软件创建一个无系统的虚拟机后用u盘安装centos7.8系统_collapser_的博客-程序员秘密

计算机维修第一次实验报告目录实验内容实验流程1.使用VMware创建一个没有系统的虚拟机2.为虚拟机设置u盘启动路径3.制作U盘启动盘①失败案例①成功案例4.给虚拟机安装centos7.8实验内容使用VMware软件开一个无系统的虚拟机后用u盘安装centos7.8系统一台电脑 一个u盘 在电脑上下载并安装 VMware 在centos官网下载centos7.8的镜像文件 安装一款启动盘制作软件1.从VMware官网下载最新版本VMware并安装选择Workstation Pro即可跳转至版本选

在线制作微信跳转浏览器下载app源码_weixin_44924607的博客-程序员秘密

微信自动跳转外部浏览器下载app/打开指定页面源码源码说明:适用安卓和苹果系统,支持任何网页链接。并且无论链接是否已经被微信拦截,均可实现微信内自动跳转浏览器打开。生成的跳转链接具有极佳的防拦截效果。使用方法:以下以app的下载链接为例,如果是网页直接复制链接即可。1. 打开你的app点击分享按钮,在分享弹框中点击复制链接或通过分享到微信QQ等获取分享链接。如果是朋友分...