我使用MVC来显示一堆文件名,并且在CTableView中有选择全部并解剖全部的操作。文件数可能是数千个,所以,我编写了一个线程来执行这些操作,例如:
for (int row = 0; row < m_ImgMgr->m_TableModel->rowCount(); row++)
{
//QtSleep(5);
for (int column = 0; column < m_ImgMgr->m_TableModel->columnCount(); column++)
{
//LogLog( QString(" sel 1") ) ;
m_ImgMgr->listImages2->selectionModel()->select(m_ImgMgr->listImages2->model()->index(row, column), QItemSelectionModel::Select);
}
//LogLog(QString(" sel 2"));
m_ImgMgr->labelImageIndex->setText(QString::number(row+1) + QString("/") + QString::number(m_ImgMgr->m_TableModel->rowCount()));
//LogLog(QString(" sel 3"));
}
但是消耗时间是不可接受的。如果数字很大,则在循环结束时,操作似乎变得越来越慢,可以从GUI中显示的计数看到它。
我也尝试过以下方法:
QItemSelection sel = m_ImgMgr->listImages2->selectionModel()->selection( ) ;
QModelIndex topleft = m_ImgMgr->listImages2->model()->index( 0 , 0 ) ;
QModelIndex bottonright = m_ImgMgr->listImages2->model()->index(m_ImgMgr->m_TableModel->rowCount(), 3 ) ;
sel.select( topleft , bottonright ) ;
无功能。
#include <QTableView>
#include <QVBoxLayout>
#include <QStandardItemModel>
#include <QApplication>
#include <QPushButton>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QWidget mainWid;
QAbstractItemModel* model = new QStandardItemModel(&mainWid);
model->insertColumns(0,4);
model->insertRows(0,5000);
for(int rowIter = 0, maxRow = model->rowCount();rowIter<maxRow;++rowIter){
for(int colIter = 0, maxCol = model->columnCount();colIter<maxCol;++colIter){
model->setData(model->index(rowIter,colIter),QStringLiteral("%1,%2").arg(rowIter+1).arg(colIter+1));
}
}
QTableView* table = new QTableView(&mainWid);
table->setModel(model);
QPushButton* selectAllButton = new QPushButton(QStringLiteral("Select All"),&mainWid);
QObject::connect(selectAllButton,&QPushButton::clicked,table,[table]()->void{
const QItemSelection selec(table->model()->index(0,0),table->model()->index(table->model()->rowCount()-1,table->model()->columnCount()-1));
table->selectionModel()->select(selec,QItemSelectionModel::ClearAndSelect);
});
QVBoxLayout* mainLay = new QVBoxLayout(&mainWid);
mainLay->addWidget(selectAllButton);
mainLay->addWidget(table);
mainWid.show();
return a.exec();
}
这是解决方案,感谢VRonin @ forum.qt.io