Две таблицы в одном QTableView

Теперь у вас есть такой вид:

Первая версия просмотра

Первый столбец заморожен, как в примере с заморозкой

Я хочу создать представление следующим образом:

Вторая версия просмотра

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


person kostap    schedule 20.10.2015    source источник
comment
Вы пытались использовать QAbstractProxyModel для объединения двух моделей?   -  person Dimitry Ernot    schedule 20.10.2015
comment
@RomhaKorev, нет, я не могу найти ни одного примера по моей проблеме. Можете ли вы показать мне, если он существует?   -  person kostap    schedule 22.10.2015
comment
см. этот вопрос, вы можете использовать QSqlQueryModel   -  person S.M.Mousavi    schedule 08.01.2017


Ответы (1)


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

замораживание.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

замораживание.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);
}
person kostap    schedule 11.11.2015