2015-01-28 17 views
5

Tôi cần tải tập dữ liệu nặng vào QTableView. Dataset là không ít hơn 700Mb trong bộ nhớ và tôi không muốn tải tất cả nó vào bộ nhớ.QTableView + bảng tùy chỉnhMô hình + tải lười biếng

QSqlQueryModel không lý tưởng cho tôi vì 2 lý do - nó không thể chỉnh sửa được và nó không thực sự tải theo yêu cầu (vì tìm nạp toàn bộ dữ liệu vào bộ nhớ).

Những gì tôi muốn để có được

  • Tôi muốn lưu trữ chỉ có một số phần của dữ liệu trong bộ nhớ. Chỉ cần hiển thị và có thể một số bộ đệm để cuộn nhanh.
  • mẫu nên có thể chỉnh sửa
  • Nó phải là bộ nhớ tiêu thụ thấp
  • nên không có đóng băng

Làm thế nào tôi đang cố gắng để giải quyết (mô hình đơn giản của mã của tôi) này

  1. QTableView tùy chỉnh (tableView)
  2. Bảng tùy chỉnhMô hình (mô hình)
  3. Trình bao bọc mẫu. (wrapper)

Hàng mẫu chọn trình bao bọc được tính từ cơ sở dữ liệu và đặt giá trị này thành mô hình. Bây giờ mô hình có thể trả lời cho int rowCount().

Giá trị tương tự này được đặt cho tableView.verticalScrollBar().

tín hiệu tableView.verticalScrollBar (valueChanged) được kết nối với khe tableview (on_valueChanged)

Một số mã

tableView::on_valueChanged(value) 
{ 
    wrapper.changeOffset(value); 
} 

wrapper::changeOffset(value) 
{ 
    if (_offset == value){ 
    return; 
    } 

    _selectQuery->seek(value);  
    int endValue = qMin(value + _cacheSize, model->rowCount()); 
    _list.clear(); 
    for(int i = value; i < endValue-1; i++){  
    _list.append(_selectQuery->record()); 
    } 
    model->setRecordList(_list); 
    _offset = value; 
    model->setOffset(_offset); 

}

_selectQuery trong wrapper :: changeOffset được previosly thực hiện QSqlQuery con trỏ cho các kết quả truy vấn chọn lọc.

Tôi cũng thực hiện một số phương pháp trong mô hình

QVariant SqlRecModel::data(const QModelIndex &index, int role) const 
{ 
    int row = index.row() - _offset;   
    if (row > m_recList.size() || row < 0){ 
     return QVariant(); 
    } 
    if (role == Qt::DisplayRole) 
    { 
     QVariant value = m_recList.at(row).value(index.column()); 
     return value; 
    } 
    return QVariant(); 
} 

Setter cho việc lưu trữ mô hình dữ liệu

void SqlRecModel::setRecordList(const QList<QSqlRecord> &records) 
{ 
    qDebug() << "r:"; 
    emit layoutAboutToBeChanged(); 
    m_recList = records; 
    emit layoutChanged(); 
} 

Vấn đề

tôi có thể cuộn hàng _cacheSize, nhưng tôi nhận được chương trình sụp đổ (The đã hoàn thành bất ngờ.) sau khi thoát khỏi cacheRange cũ.

Bạn có lời khuyên nào không? Tôi không biết phải đào đâu. Cảm ơn!

+1

Nếu bạn gặp sự cố: hãy gỡ lỗi trình gỡ lỗi của bạn và bắt đầu tìm kiếm _where_ sự cố xảy ra. –

+0

Bạn nói đúng. Tôi đang trên đường để cài đặt trình gỡ lỗi bình thường. Hiện tại cho thấy lỗi ReadAccess tại 0x0. Ngoại lệ ở đâu đó trong QSqlRecord Qt5Sql! QSqlRecord :: QSqlRecord: 0x675f71d0: mov rax, qword ptr [rdx] –

Trả lời

0

Xin lỗi vì đã làm phiền.

Lỗi trong khối mã khác.

Bằng cách này, tôi chỉ có thể giải quyết nhiệm vụ mà tôi có.

btw: nếu bạn chơi với bộ nhớ đệm, bạn có thể đạt được cuộn mượt mà hơn.

Các vấn đề liên quan