我在 Qt 4.8.4 中使用 QTableView 来可视化大量数据(大/许多蛋白质氨基酸序列),我希望能够使细胞尽可能小,这样我就可以将尽可能多的数据打包成一个给定的窗口。我遇到的问题是,当同时显示许多单元格时,所有内容(例如滚动、调整大小和一般重新绘制)都会减慢到爬行。这是一些示例代码(改编自示例/教程/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();
}
这是运行表格视图的代码:
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();
}
当我在 OSX 上上下滚动时使用 Instruments 时,它会QWidgetPrivate::drawWidget
在堆栈中上下花费大量时间,QWidgetPrivate::paintSiblingsRecursive
......即,它会花费大量时间重绘我的表格。
我是 Qt 的新手,所以我不确定如何解决这个问题。我是不是该:
- 覆盖paint方法?即也许我可以将我的整个表格保存为图像,并且当滚动发生时,只需重新绘制图像直到移动停止(然后返回直接绘制表格)?
- 根本不使用 Qt 中的表?也许我可以只使用一个文本字段来完成我的目的?例如对于文本中的每个字母,我想要悬停文本、选择、着色字母的背景等。
这两个选项似乎都需要做很多工作来弥补从 QTableView 切换而失去的基础。还有其他建议吗?