2013-06-02 1 views
2

У меня есть QTableView с моей собственной пользовательской моделью. Он содержит таблицу столбцов текста, каждая из которых имеет совершенно разные максимальные размеры.Относительные подсказки размера для столбцов QTableView

Я знаю, что могу реализовать свой собственный делегат объекта, чтобы предоставить подсказку размера для столбцов, но похоже, что это указано в пикселях. Я предпочел бы сделать это независимым от резолюции образом.

Есть ли способ указать требуемые размеры столбцов в соотношениях друг друга, аналогично тому, как горизонтальные факторы растяжения работают в макетах?

ответ

3

StretchingHeader.h:

#ifndef STRETCHINGHEADER_H 
#define STRETCHINGHEADER_H 

#include <QHeaderView> 

class StretchFactors : public QList <int> 
{ 
public: 
    StretchFactors() : 
     QList() 
    {} 
    StretchFactors(const StretchFactors &other) : 
     QList(other) 
    {} 
    StretchFactors(const QList <int> &other) : 
     QList(other) 
    {} 

    int factor(int section) 
    { 
     if (section < count()) 
      return at(section); 
     return 1; 
    } 
}; 

class StretchingHeader : public QHeaderView 
{ 
    Q_OBJECT 
public: 
    explicit StretchingHeader(Qt::Orientation orientation, QWidget *parent = 0); 

    void setStretchFactors(const StretchFactors &stretchFactors); 

protected: 
    void resizeEvent(QResizeEvent *event); 
    void showEvent(QShowEvent *event); 

    void stretch(); 

protected: 
    StretchFactors mStretchFactors; 
}; 

#endif // STRETCHINGHEADER_H 

StretchingHeader.cpp:

#include "StretchingHeader.h" 

StretchingHeader::StretchingHeader(Qt::Orientation orientation, QWidget *parent) : 
    QHeaderView(orientation, parent) 
{ 
} 

void StretchingHeader::setStretchFactors(const StretchFactors &stretchFactors) 
{ 
    mStretchFactors = stretchFactors; 
} 

void StretchingHeader::resizeEvent(QResizeEvent *event) 
{ 
    QHeaderView::resizeEvent(event); 
    if (!mStretchFactors.isEmpty()) 
     stretch(); 
} 

void StretchingHeader::showEvent(QShowEvent *event) 
{ 
    QHeaderView::showEvent(event); 
    if (!mStretchFactors.isEmpty()) 
     stretch(); 
} 

void StretchingHeader::stretch() 
{ 
    int totalStretch = 0; 
    for (int i = 0; i < count(); ++i) 
     totalStretch += mStretchFactors.factor(i); 
    int oneWidth = width()/totalStretch; 
    for (int i = 0; i < count(); ++i) 
     resizeSection(i, oneWidth * mStretchFactors.factor(i)); 
} 

Использование:

StretchingHeader *header = new StretchingHeader(Qt::Horizontal, tableWidget); 
header->setStretchFactors(StretchFactors() << 1 << 2 << 3); 
header->setResizeMode(QHeaderView::Fixed); 
header->setStretchLastSection(true); 
tableWidget->setHorizontalHeader(header); 
+0

людей, ты спас меня, тх nk вы! – Rinat