我在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的新手,所以我不确定如何解决这个问题.我是不是该:
这两个选项似乎都是通过切换QTableView来弥补地面损失的大量工作.还有其他建议吗?
众所周知,QTableView 在处理大型数据集时速度很慢。我建议你切换到Qt Graphics View Framework。它效率更高,并且足够灵活以显示表格。
QGraphicsScene scene;
QFont font("Courier",12);
QFontMetrics font_metrics(font);
int padding = 2;
int column_width = font_metrics.width("X") + padding * 2;
int row_height = font_metrics.height() + padding * 2;
int rows = 200, columns = 60;
for(int x = 0; x < columns; x++) {
for(int y = 0; y < rows; y++) {
QGraphicsSimpleTextItem* item = scene.addSimpleText(QString().setNum(y % 10), font);
item->setPos(x * column_width + padding, y * row_height + padding);
}
}
for(int x = 0; x < columns + 1; x++) {
int line_x = x * column_width;
scene.addLine(line_x, 0, line_x, rows * row_height)->setPen(QPen(Qt::gray));
}
for(int y = 0; y < rows + 1; y++) {
int line_y = y * row_height;
scene.addLine(0, line_y, columns * column_width, line_y)->setPen(QPen(Qt::gray));
}
QGraphicsView view(&scene);
view.resize(700, 700);
view.show();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3856 次 |
| 最近记录: |