QTableView自定义左上角CornerWidget

一、效果图

图中高亮部分即为CornerWidget
在这里插入图片描述

二、头文件及实现

#include <QHeaderView>
#include <QTableView>
#include <QStandardItemModel>

class CustomerStandardModel : public QStandardItemModel{
    Q_OBJECT
public:
    explicit CustomerStandardModel(QObject* parent = nullptr);
    CustomerStandardModel(int rows, int columns, QObject *parent = Q_NULLPTR);
    ~CustomerStandardModel(){

    }
    QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;
};

class QPushButton;
class CustomerPrivacyTableVeiw : public QTableView
{
    Q_OBJECT
    Q_DECLARE_PRIVATE(QTableView)
public:
    explicit CustomerPrivacyTableVeiw(QWidget *parent = nullptr , const QString cornerText = "");
    virtual ~CustomerPrivacyTableVeiw();
    void setHierarchicalHeader(QHeaderView* header ,Qt::Orientation direction);
    void setCornerText(const QString text);

private:
    QHeaderView* m_veticalHeader;
    QHeaderView* m_horizontalHeader;
    QPushButton* m_cornerButton;
signals:

};


#include "CustomerPrivacyTableVeiw.h"
#include <QPushButton>
#include <private/qtableview_p.h>

CustomerPrivacyTableVeiw::CustomerPrivacyTableVeiw(QWidget *parent ,const QString cornerText) : QTableView(parent),
    m_veticalHeader(nullptr) , m_horizontalHeader(nullptr)
{
    m_cornerButton = new QPushButton(cornerText,this);
    Q_D(QTableView);
    disconnect(d->cornerWidget, SIGNAL(clicked()), this, SLOT(selectAll()));
    delete (d->cornerWidget);
    m_cornerButton->setObjectName("LabelCorner");
    d->cornerWidget = m_cornerButton;
    setSelectionMode(QAbstractItemView::SingleSelection);
    setObjectName("viewPropotion");
}

CustomerPrivacyTableVeiw::~CustomerPrivacyTableVeiw()
{
    delete m_cornerButton;
}

void CustomerPrivacyTableVeiw::setHierarchicalHeader(QHeaderView *header, Qt::Orientation direction)
{
    if(Qt::Horizontal == direction){
        m_veticalHeader = header;
        setHorizontalHeader(header);
        header->setSectionResizeMode(QHeaderView::Stretch);
    }
    else{
        m_horizontalHeader = header;
        setVerticalHeader(header);
    }
//    header->setParent(this);
    header->setObjectName(Qt::Horizontal == direction ?  "PrivacyTableViewHorizontalHeader" : "PrivacyTableViewVerticalHeader");
}

void CustomerPrivacyTableVeiw::setCornerText(const QString text)
{
    m_cornerButton->setText(text);
}


CustomerStandardModel::CustomerStandardModel(QObject *parent): QStandardItemModel(parent){

}

CustomerStandardModel::CustomerStandardModel(int rows, int columns, QObject *parent):
    QStandardItemModel(rows ,columns ,parent)
{

}

QVariant CustomerStandardModel::headerData(int section, Qt::Orientation orientation, int role) const{

    if(Qt::Vertical == orientation)
        switch (role) {
        case Qt::SizeHintRole:
            return QSize(80 ,80);
        case Qt::TextAlignmentRole:
            return Qt::AlignCenter;

        }
    return QStandardItemModel::headerData(section  , orientation ,role );
}


int main(int argc, char *argv[])
{
    QApplication::setAttribute(Qt::AA_DisableHighDpiScaling);
    QApplication a(argc, argv);
    auto view = new CustomerPrivacyTableVeiw;
    auto model = new CustomerStandardModel();
    model->setColumnCount(5);
    for(int i = 0 ; i < 5 ; i ++)
        model->appendRow(new QStandardItem(QString::number(i)));

    view->setModel(model);
    view->setCornerText("序号");
    view->show();

    return a.exec();
}
<think>好的,我现在需要解决用户的问题:在QT中实现QTableView左上角corner widget的透明效果。首先,用户提到了参考引用中的内容,特别是关于setCornerButtonEnabled和setCornerWidget的方法。根据引用[1],QTableCornerButton可以通过setCornerWidget来设置其他QWidget对象,而引用[2]提到setCornerButtonEnabled可以控制按钮的可见性。 首先,我需要确认QTableView左上角corner widget默认是QTableCornerButton,这个按钮属于QAbstractButton类型。要实现透明效果,可能需要替换这个按钮为一个透明的自定义widget,或者修改其样式表。 可能的步骤是: 1. 使用setCornerButtonEnabled(false)来隐藏默认的按钮,防止其显示干扰。 2. 创建一个透明的QWidget,例如QWidget,并设置其背景为透明。 3. 使用setCornerWidget将这个透明widget设置到左上角。 4. 可能需要设置Qt::WA_TranslucentBackground属性,并调整窗口标志,确保透明生效。 5. 应用样式表来确保背景透明,如设置background-color为transparent。 需要注意的潜在问题包括:父级控件的背景是否会影响透明效果,是否需要启用Qt::WA_TranslucentBackground,以及是否要关闭自动填充背景。此外,如果父控件有样式,可能需要覆盖以确保透明。 接下来,验证这些步骤的可行性。创建一个自定义的QWidget,设置其属性为透明,然后作为corner widget添加进去。同时,隐藏默认的按钮。可能还需要调整布局或样式表来确保透明效果正确显示。 然后,编写示例代码,测试是否能够实现透明。如果发现背景仍然不透明,可能需要进一步调整样式表或控件的属性。例如,设置样式表为“background-color: transparent; border: none;”来移除边框和设置透明背景。 最后,总结步骤并提供代码示例,确保用户能够按照指导操作,并注意可能的注意事项,如父控件的影响和属性设置的正确顺序。</think>要实现$QTableView$左上角$corner\ widget$的透明效果,可通过以下步骤实现: ### 方法实现 1. **隐藏默认按钮** ```cpp tableView->setCornerButtonEnabled(false); // 关闭默认按钮[^2] ``` 2. **创建透明控件** ```cpp QWidget* transparentCorner = new QWidget(); transparentCorner->setAttribute(Qt::WA_TranslucentBackground); // 关键透明度属性 transparentCorner->setStyleSheet("background: transparent;"); // CSS透明支持 ``` 3. **设置corner widget** ```cpp tableView->setCornerWidget(transparentCorner); // 替换默认区域[^1] ``` ### 完整示例代码 ```cpp // 创建表格视图 QTableView *tableView = new QTableView(this); tableView->setCornerButtonEnabled(false); // 禁用默认按钮 // 创建透明控件 QWidget *cornerWidget = new QWidget(); cornerWidget->setAutoFillBackground(false); cornerWidget->setAttribute(Qt::WA_TranslucentBackground); cornerWidget->setStyleSheet("QWidget { background: transparent; border: none; }"); // 设置到左上角区域 tableView->setCornerWidget(cornerWidget); ``` ### 关键注意事项 1. **层级关系**:需确保父控件未设置不透明背景 2. **属性顺序**:`WA_TranslucentBackground`必须在控件显示前设置 3. **样式冲突**:若父控件有全局样式,需添加`!important`声明: ```css background: transparent !important; ``` ### 效果验证 通过`QSS`调试工具检查控件背景属性,应显示为: $$ RGBA(0,0,0,0) $$ 若仍不透明,可尝试设置窗口标志: ```cpp setWindowFlags(Qt::FramelessWindowHint); setAttribute(Qt::WA_TranslucentBackground); ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值