gzfstudy的个人主页

http://www.qtcn.org/bbs/u/144985  [收藏] [复制]

gzfstudy

  • 16

    关注

  • 3

    粉丝

  • 3

    访客

  • 等级:新手上路
  • 总积分:28
  • 男,1979-12-24

最后登录:2023-06-10

更多资料

日志

如何在QTableView的左上角cornerButton上显示文字。

2013-09-12 10:06
在写程序的过程中遇到一种情况,需要在QTableView的cornerButton上显示文字,但是QTableView并没有提供这种功能,只提供了全选的功能。在查看了一上午源代码的情况终于把这个问题给解决了。功能很简单,现在分享给大家,希望能给需要的朋友一些帮助。
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
头文件 gcornertableview.h

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#ifndef GCORNERTABLEVIEW_H
#define GCORNERTABLEVIEW_H#include <QTableView>
#include <QAbstractButton>
#include <QPainter>
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.init(this);
        QStyle::State state = QStyle::State_None;        
        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

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////cpp文件 gcornertableview.cpp
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include "gcornertableview.h"#include <QHeaderView>
#include <private/qtableview_p.h>
#include <QFontMetrics>
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)
{
    m_cornerButtonText = text;    Q_D(QTableView);
    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();
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
使用example///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
GCornerTableView *test = new GCornerTableView();test->setText(tr("测试"));
分类:默认分类|回复:0|浏览:2222|全站可见|转载
 

下一篇: 求救:树形结构???

上一篇:

Powered by phpwind v8.7 Certificate Copyright Time now is:04-28 05:28
©2005-2016 QTCN开发网 版权所有 Gzip disabled