{
bool filterAcceptsRow
( int source_row,
const QModelIndex & source_parent
) const;
};
static int state;
bool MyProxy
::filterAcceptsRow( int source_row,
const QModelIndex & source_parent
) const {
bool res;
switch(state)
{
case 0:
res = true;
break;
case 1:
res = this->sourceModel()->data(this->sourceModel()->index(source_row,1,source_parent)).toBool() == true;
break;
case 2:
res = this->sourceModel()->data(this->sourceModel()->index(source_row,1,source_parent)).toBool() == false;
break;
}
return res;
}
MyProxy * proxy;
void MainWindow::onclick()
{
state++;
if (state > 2) state = 0;
proxy->invalidate();
}
MainWindow
::MainWindow(QWidget *parent
){
for (int i = 0; i < 100000; i++)
{
model->insertRow(model->rowCount());
model
->setData
(model
->index
(model
->rowCount
() - 1,
0),
QString("Testing %1").
arg(i
), Qt
::DisplayRole);
model
->setData
(model
->index
(model
->rowCount
() - 1,
1), i
% 2 ?
QVariant(true) : QVariant(false), Qt
::DisplayRole);
}
proxy = new MyProxy;
proxy->setSourceModel(model);
connect(button, SIGNAL(clicked()), this, SLOT(onclick()));
tv->setModel(proxy);
splitter->addWidget(tv);
splitter->addWidget(button);
setCentralWidget(splitter);
}
class MyProxy : public QSortFilterProxyModel
{
bool filterAcceptsRow( int source_row, const QModelIndex & source_parent ) const;
};
static int state;
bool MyProxy::filterAcceptsRow( int source_row, const QModelIndex & source_parent ) const
{
bool res;
switch(state)
{
case 0:
res = true;
break;
case 1:
res = this->sourceModel()->data(this->sourceModel()->index(source_row,1,source_parent)).toBool() == true;
break;
case 2:
res = this->sourceModel()->data(this->sourceModel()->index(source_row,1,source_parent)).toBool() == false;
break;
}
return res;
}
MyProxy * proxy;
void MainWindow::onclick()
{
state++;
if (state > 2) state = 0;
proxy->invalidate();
}
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
QStandardItemModel * model = new QStandardItemModel(0, 2);
for (int i = 0; i < 100000; i++)
{
model->insertRow(model->rowCount());
model->setData(model->index(model->rowCount() - 1, 0), QString("Testing %1").arg(i), Qt::DisplayRole);
model->setData(model->index(model->rowCount() - 1, 1), i % 2 ? QVariant(true) : QVariant(false), Qt::DisplayRole);
}
proxy = new MyProxy;
proxy->setSourceModel(model);
QSplitter * splitter = new QSplitter;
QTreeView * tv = new QTreeView;
QPushButton * button = new QPushButton;
connect(button, SIGNAL(clicked()), this, SLOT(onclick()));
tv->setModel(proxy);
splitter->addWidget(tv);
splitter->addWidget(button);
setCentralWidget(splitter);
}
To copy to clipboard, switch view to plain text mode
Bookmarks