2015-10-20 4 views
0

Теперь имеют вид, как это:Две таблицы в одном QTableView

First version of view

Первая колонка замерзает, как в freezetablewidget примере

Я хочу, чтобы создать представление, как это:

Second version of view

Т.е. одна полоса прокрутки для двух qabstractItemModel. Вторая таблица: avg, min, max из первой таблицы. Все таблицы из базы данных sqlite.

+2

Вы попробуйте использовать 'QAbstractProxyModel' объединить ваши две модели? –

+0

@RomhaKorev, нет, я не могу найти никакого примера о моей проблеме. Можете ли вы показать мне, если она существует? – kostap

+0

см. [Этот вопрос] (http://stackoverflow.com/questions/17156286/how-to-display-content-of-multiple-qsqltablemodels-in-one-qtableview) вы можете использовать 'QSqlQueryModel' –

ответ

0

создать решение этой проблемы:

freezetableview.h

#ifndef FREEZETABLEWIDGET_H 
#define FREEZETABLEWIDGET_H 

#include <QObject> 
#include <QWidget> 
#include <QTableView> 
#include <QSortFilterProxyModel> 

#include "backgroundcolordelegate.h" 
#include "sortproxymodel.h" 
//#include "colorabstractitemmodel.h" 

class FreezeTableView : public QTableView 
{ 
    Q_OBJECT 
public: 
    FreezeTableView(QWidget * parent = 0); 
    FreezeTableView(QAbstractItemModel * model); 
    ~FreezeTableView(); 
    void init(); 
    void setModel(QAbstractItemModel *model); 



protected: 
    virtual void resizeEvent(QResizeEvent *event); 
    virtual QModelIndex moveCursor(CursorAction cursorAction, Qt::KeyboardModifiers modifiers); 
    void scrollTo (const QModelIndex & index, ScrollHint hint = EnsureVisible); 


private: 
//  void init(); 
     void updateFrozenTableGeometry(); 


private slots: 
    void updateSectionWidth(int logicalIndex, int oldSize, int newSize); 
    void updateSectionHeight(int logicalIndex, int oldSize, int newSize); 

public: 
    QTableView *m_mathTableView; 

private: 
    QTableView   *m_frozenTableView; 
    SortProxyModel  *m_sortModel; 
// QAbstractItemModel *m_model; 
     //  ColorAbstractItemModel *itemModel; 
}; 

#endif // FREEZETABLEWIDGET_H 

freezetableview.cpp

#include "freezetableview.h" 

#include <QScrollBar> 
#include <QHeaderView> 
#include <QStandardItemModel> 
#include <QSortFilterProxyModel> 

FreezeTableView::FreezeTableView(QWidget * parent) 
    :QTableView(parent) 
{ 
// m_model = new QStandardItemModel(0,3,this); 
// m_sortModel = new SortProxyModel(this); 
// sortModel->setSourceModel(new QStandardItemModel(0,3,this)); 
// m_sortModel->setSourceModel(m_model); 
// m_sortModel->setDynamicSortFilter(true); 
// m_frozenTableView->setModel(m_sortModel); 

    m_sortModel = new SortProxyModel(this); 
    //work 
    setModel(new QStandardItemModel(0,3,this)); 
    m_frozenTableView = new QTableView(this); 
    m_mathTableView = new QTableView(this); 
    // 

    init(); 

    //connect the headers and scrollbars of both tableviews together 
    connect(horizontalHeader(),SIGNAL(sectionResized(int,int,int)), this, 
      SLOT(updateSectionWidth(int,int,int))); 
    connect(verticalHeader(),SIGNAL(sectionResized(int,int,int)), this, 
      SLOT(updateSectionHeight(int,int,int))); 

    connect(m_frozenTableView->verticalScrollBar(), SIGNAL(valueChanged(int)), 
      verticalScrollBar(), SLOT(setValue(int))); 
    connect(verticalScrollBar(), SIGNAL(valueChanged(int)), 
      m_frozenTableView->verticalScrollBar(), SLOT(setValue(int))); 

// connect(mathTableView->verticalScrollBar(), SIGNAL(valueChanged(int)), 
//   verticalScrollBar(), SLOT(setValue(int))); 
// connect(verticalScrollBar(), SIGNAL(valueChanged(int)), 
//   mathTableView->verticalScrollBar(), SLOT(setValue(int))); 

    connect(m_mathTableView->horizontalScrollBar(), SIGNAL(valueChanged(int)), 
      horizontalScrollBar(), SLOT(setValue(int))); 
    connect(horizontalScrollBar(), SIGNAL(valueChanged(int)), 
      m_mathTableView->horizontalScrollBar(), SLOT(setValue(int))); 

    BackgroundColorDelegate *delegate = new BackgroundColorDelegate(this); 
    this->setItemDelegate(delegate); 
} 

FreezeTableView::FreezeTableView(QAbstractItemModel * model) 
{ 
    // не вызывается 
    qDebug("FreezeTableView::FreezeTableView(QAbstractItemModel * model) opening!!!"); 
    setModel(model); 
    m_frozenTableView = new QTableView(this); 

    init(); 

    //connect the headers and scrollbars of both tableviews together 
    connect(horizontalHeader(),SIGNAL(sectionResized(int,int,int)), this, 
      SLOT(updateSectionWidth(int,int,int))); 
    connect(verticalHeader(),SIGNAL(sectionResized(int,int,int)), this, 
      SLOT(updateSectionHeight(int,int,int))); 

    connect(m_frozenTableView->verticalScrollBar(), SIGNAL(valueChanged(int)), 
      verticalScrollBar(), SLOT(setValue(int))); 
    connect(verticalScrollBar(), SIGNAL(valueChanged(int)), 
      m_frozenTableView->verticalScrollBar(), SLOT(setValue(int))); 

    //  BackgroundColorDelegate *delegate = new BackgroundColorDelegate(); 
    //  this->setItemDelegate(delegate); 
} 

FreezeTableView::~FreezeTableView() 
{ 
    delete m_frozenTableView; 
    delete m_mathTableView; 
    if(m_sortModel != NULL) 
    { 
     delete m_sortModel; 
    } 
// delete m_model; 
} 

void FreezeTableView::init() 
{ 
    m_frozenTableView->setModel(model()); 
    m_frozenTableView->setFocusPolicy(Qt::NoFocus); 
    m_frozenTableView->verticalHeader()->hide(); 
    m_frozenTableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Fixed); 

    //mathTableView->setModel(model()); 
    m_mathTableView->setFocusPolicy(Qt::NoFocus); 
    m_mathTableView->verticalHeader()->hide(); 
    m_mathTableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Fixed); 

    viewport()->stackUnder(m_mathTableView); 
    viewport()->stackUnder(m_frozenTableView); 


//  frozenTableView->setStyleSheet("QTableView { border: none;" 
//          "background-color: #8EDE21;" 
//          "selection-background-color: #999}"); //for demo purposes 
    m_frozenTableView->setSelectionModel(selectionModel()); 
    for (int col = 1; col < model()->columnCount(); ++col) 
     m_frozenTableView->setColumnHidden(col, true); 

    m_frozenTableView->setColumnWidth(0, columnWidth(0)); 

    m_frozenTableView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); 
    m_frozenTableView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); 

    setHorizontalScrollMode(ScrollPerPixel); 
    setVerticalScrollMode(ScrollPerPixel); 
    m_frozenTableView->setVerticalScrollMode(ScrollPerPixel); 

    //mathTableView 
// mathTableView->setSelectionModel(selectionModel()); 

    m_mathTableView->setColumnWidth(0, columnWidth(0)); 

    m_mathTableView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); 
    m_mathTableView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); 

    setHorizontalScrollMode(ScrollPerPixel); 
    setVerticalScrollMode(ScrollPerPixel); 
    m_mathTableView->setVerticalScrollMode(ScrollPerPixel); 

    m_mathTableView->show(); 
    m_frozenTableView->show(); 

    updateFrozenTableGeometry(); 
} 


void FreezeTableView::updateSectionWidth(int logicalIndex, int /* oldSize */, int newSize) 
{ 
    m_mathTableView->setColumnWidth(logicalIndex, newSize); 
    if (logicalIndex == 0){ 
     m_frozenTableView->setColumnWidth(0, newSize); 
    } 
    updateFrozenTableGeometry(); 
} 

void FreezeTableView::updateSectionHeight(int logicalIndex, int /* oldSize */, int newSize) 
{ 
    m_frozenTableView->setRowHeight(logicalIndex, newSize); 
} 


void FreezeTableView::resizeEvent(QResizeEvent * event) 
{ 
     QTableView::resizeEvent(event); 
     updateFrozenTableGeometry(); 
} 

QModelIndex FreezeTableView::moveCursor(CursorAction cursorAction, 
              Qt::KeyboardModifiers modifiers) 
{ 
    QModelIndex current = QTableView::moveCursor(cursorAction, modifiers); 

    if (cursorAction == MoveLeft && current.column() > 0 
      && visualRect(current).topLeft().x() < m_frozenTableView->columnWidth(0)){ 
     const int newValue = horizontalScrollBar()->value() + visualRect(current).topLeft().x() 
          - m_frozenTableView->columnWidth(0); 
     horizontalScrollBar()->setValue(newValue); 
     m_mathTableView->horizontalScrollBar()->setValue(newValue); 
    } 
    return current; 
} 

void FreezeTableView::scrollTo (const QModelIndex & index, ScrollHint hint){ 
    if (index.column() > 0) 
     QTableView::scrollTo(index, hint); 
} 

void FreezeTableView::updateFrozenTableGeometry() 
{ 
    int frameWidthh = frameWidth(); 
    int columnWidth0 = columnWidth(0); 
    int viewportHeight = viewport()->height(); 
    int viewportWidth = viewport()->width(); 
    int horizontalHeaderHeight = horizontalHeader()->height(); 
    int horizontalHeaderWidth = horizontalHeader()->width(); 
    int verticalHeaderHeight = verticalHeader()->height(); 
    int verticalHeaderWidth = verticalHeader()->width(); 
    int mathTableViewHeight = m_mathTableView->height(); 

    m_frozenTableView->setGeometry(verticalHeaderWidth + frameWidthh, 
           frameWidthh, 
           columnWidth0, 
           viewportHeight+horizontalHeaderHeight); 
    m_mathTableView->setGeometry(verticalHeaderWidth + frameWidthh, 
          frameWidthh + horizontalHeaderHeight + viewportHeight - mathTableViewHeight, 
          viewportWidth, 
          mathTableViewHeight); 
} 

void FreezeTableView::setModel(QAbstractItemModel *model) 
{ 
    m_sortModel = new SortProxyModel(this); 
    m_sortModel->setSourceModel(model); 
    QTableView::setModel(m_sortModel); 
}