日志
如何在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("测试")); |
下一篇: 求救:树形结构???
上一篇: 无