0
現在有這樣一種觀點:兩個表中的一個QTableView中
第一列被凍結就像freezetablewidget例如
我想這樣的創建視圖:
iee兩個qabstractItemModel的滾動條。第二個表格是第一個表格中的平均值,最小值,最大值。來自sqlite數據庫的所有表。
現在有這樣一種觀點:兩個表中的一個QTableView中
第一列被凍結就像freezetablewidget例如
我想這樣的創建視圖:
iee兩個qabstractItemModel的滾動條。第二個表格是第一個表格中的平均值,最小值,最大值。來自sqlite數據庫的所有表。
我創建這個問題的解決方案:
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);
}
你有沒有試着用'QAbstractProxyModel'你的兩款車型合併嗎? –
@RomhaKorev,不,我找不到任何關於我的問題的例子。你能告訴我,如果存在? – kostap
看到[這個問題](http://stackoverflow.com/questions/17156286/how-to-display-content-of-multiple-qsqltablemodels-in-one-qtableview)你可以使用'QSqlQueryModel' –