相关疑难解决方法(0)

QTableView具有1000个可见单元的慢性能

我在Qt 4.8.4中使用QTableView可视化大量数据(大量/多种蛋白质氨基酸序列),我希望能够使细胞尽可能小,这样我就能尽可能多地包装细胞.给定窗口.我遇到的问题是,当同时显示许多单元格时,所有内容(例如滚动,调整大小和一般重新绘制)都会减慢到爬行速度.这是一些示例代码(改编自examples/tutorials/1_readonly教程):

MyModel::MyModel(QObject *parent):QAbstractTableModel(parent){}

int MyModel::rowCount(const QModelIndex & /*parent*/) const {
   return 200;
}
int MyModel::columnCount(const QModelIndex & /*parent*/) const {
    return 60;
}
QVariant MyModel::data(const QModelIndex &index, int role) const {
    if (role == Qt::DisplayRole){
       return QString("%1").arg(index.row()%10);
    }
    return QVariant();
}
Run Code Online (Sandbox Code Playgroud)

这是运行表视图的代码:

int main(int argc, char *argv[]){
   QApplication a(argc, argv);
   QTableView tableView;    
   tableView.horizontalHeader()->setDefaultSectionSize(15);
   tableView.verticalHeader()->setDefaultSectionSize(15);
   tableView.setFont(QFont("Courier",12));
   MyModel myModel(0);
   tableView.setModel( &myModel );
   tableView.setGeometry(0,0,1000,1000);
   tableView.show();
   return a.exec();
}
Run Code Online (Sandbox Code Playgroud)

当我在OSX上使用Instruments上下滚动时,它QWidgetPrivate::drawWidget在堆栈中花费了大量时间,QWidgetPrivate::paintSiblingsRecursive...即,它花费了大量时间重绘我的表.

我是Qt的新手,所以我不确定如何解决这个问题.我是不是该:

  • 覆盖paint方法?也许我可以将整个表格保存为图像,当滚动发生时,只需重新绘制图像直到移动停止(然后返回直接绘制表格)?
  • 根本不在Qt中使用表格?也许我可以使用Text字段来实现我的目的?例如,对于文本中的每个字母,我都喜欢hovertext,选择,着色字母的背景等.

这两个选项似乎都是通过切换QTableView来弥补地面损失的大量工作.还有其他建议吗?

c++ qt

4
推荐指数
2
解决办法
3856
查看次数

标签 统计

c++ ×1

qt ×1