如何在QTableView中加速选择?

问题描述 投票:0回答:1

我使用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 ) ;

无功能。

qt codeigniter qtableview
1个回答
0
投票

#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

© www.soinside.com 2019 - 2024. All rights reserved.