0
点赞
收藏
分享

微信扫一扫

QTableView设置表格左上的文字


设置文字和设置按钮或者其他控件都是可以的

QTableView设置表格左上的文字主要方法是继承后通过绘制在左上角

QTableView设置表格左上的文字_#include


首先写一个类继承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;
}


举报

相关推荐

0 条评论