2010-10-27 39 views
9

Tôi có một bảng có 3000 hàng và 8 cột. Tôi sử dụng QTableView. Để chèn các mục tôi làm:QTableView cực kỳ chậm (thậm chí chỉ với 3000 hàng)

QStandardItem* vSItem = new QStandardItem(); 
vSItem->setText("Blabla"); 
mModel->setItem(row, column, vSItem); 

nơi mModel là QStandardItemModel. Mọi thứ đều ổn nếu tôi không có nhiều hàng, nhưng khi tôi cố gắng hình dung dữ liệu lớn (khoảng 3000 hàng), thì cực kỳ chậm (20 giây trên Win 7 64 bit (8 lõi máy với 8 GB RAM !!!)). Tôi có thể làm gì để cải thiện hiệu suất không?

Xin cảm ơn trước.

Trả lời

1

Bạn có tự động hóa nội dung cho các cột hoặc hàng không? Nó có thể là một kẻ giết người trong hoạt động đôi khi!

Có một cái nhìn ở đây: QHeaderView::ResizeToContents

Hy vọng nó sẽ giúp!

+0

Không rõ ràng. Trừ khi điều này được thực hiện theo mặc định, tôi không có nó. – Tom

+0

Những gì tôi có là: mUi.mImagesTableView-> setAlternatingRowColors (true); mUi.mImagesTableView-> setSelectionMode (QAbstractItemView :: SingleSelection); mUi.mImagesTableView-> setSelectionBehavior (QAbstractItemView :: SelectRows); mUi.mImagesTableView-> setEditTriggers (QAbstractItemView :: NoEditTriggers); mUi.mImagesTableView-> setIconSize (QSize (vIconSize, vIconSize)); mUi.mImagesTableView-> setColumnWidth (0, vIconPlusBorder); mUi.mImagesTableView-> horizontalHeader() -> setStretchLastSection (true); – Tom

+0

thử và vô hiệu hóa setStretchLastSection, vô hiệu hóa tự động thay đổi kích thước (Tôi không nhớ nếu nó được thực hiện theo mặc định) ... Nói cách khác hãy thử và vô hiệu hóa tất cả mọi thứ có thể liên quan đến thay đổi kích thước của hàng và cột ... Trong ứng dụng của tôi, trong bản phát hành, tôi có một cây tre (với các cột) với hơn 10 nghìn mặt hàng và tôi có thể thay đổi kích cỡ mọi thứ mà không có vấn đề ... Nhưng nếu tôi bật các tính năng tự động thay đổi kích thước, các hiệu ứng của tôi sẽ giảm đi rất nhiều! –

3

Tôi đã tìm thấy giải pháp: vấn đề là tôi đã gán mô hình cho tableview đã có trong hàm tạo. Vì vậy, mỗi khi tôi chèn mục vào mẫu, xem bảng đã được thông báo và có thể được cập nhật. Bây giờ tôi chỉ gán mô hình cho chế độ xem bảng chỉ sau khi tôi điền đầy mô hình của mình bằng dữ liệu. Đây không phải là một giải pháp thanh lịch nhưng nó hoạt động. Có cách nào để tạm thời vô hiệu hóa mô hình từ chế độ xem bảng hoặc nội dung nào đó cho bảng xem là không quan tâm đến các thay đổi trong mô hình?

+1

Bạn có thể thử rối tung với blockSignals (http://doc.trolltech.com/main-snapshot/ qobject.html # blockSignals) trên mô hình, nhưng điều đó có thể sẽ khiến bạn đau đầu hơn. Thực sự, bạn nên xem xét để lại thứ tự giống nhau, hoặc thay đổi mô hình của riêng bạn (vì vậy bạn sẽ biết khi nào để nói rằng bạn đã thay đổi dữ liệu). –

+2

Đối với các tập dữ liệu lớn, tôi sẽ xem xét để viết một mô hình "thích hợp" thay vì sử dụng QStandardItemModel. Ở đó bạn có thể chèn dữ liệu vào các khối lớn hơn các mục đơn lẻ, mỗi mục kích hoạt chế độ xem để cập nhật, điều này sẽ giúp tôi thực hiện nhiều hơn. Chỉnh sửa: Tôi thấy tôi chỉ lặp lại những gì James nói dưới đây ... –

2

Đối với số lượng dữ liệu này, bạn sẽ tốt hơn với mô hình tùy chỉnh - sau đó bạn sẽ có quyền kiểm soát khi bạn thông báo chế độ xem cập nhật, chẳng hạn. Các 'tiêu chuẩn' mục quy mô đến hàng trăm, và có lẽ hàng ngàn, do phần cứng hiện đại được nhanh chóng, nhưng họ đang rõ ràng tài liệu như không được dành cho datasets kích thước này.

1

Ngoài ra, nếu tất cả các hàng của bạn có cùng chiều cao, hãy đặt http://doc.qt.io/qt-5/qtreeview.html#uniformRowHeights-prop thành true có thể tăng hiệu suất. Trong trường hợp của tôi, một mô hình chứa khoảng 50.000 hàng gần như không sử dụng được với uniformRowHeights được đặt thành false (mặc định). Sau khi thay đổi nó thành sự thật, nó hoạt động như một sự quyến rũ.

+5

Chức năng này dành cho QTreeView, ở đây chúng ta đang nói về QTableView –

+0

làm điều này gần gấp đôi tốc độ! – Midhun

6

Thực hiện cuộc gọi tốt trên nội dung tự động hóa cho các cột hoặc hàng của bạn.

Tôi có chức năng đã thêm cột vào bảng mỗi khi khách hàng kết nối với ứng dụng máy chủ của tôi. Vì số cột trong bảng lớn, thời gian chèn dường như mất nhiều thời gian hơn và lâu hơn.

Tôi đã thực hiện một ui-> messageLog-> resizeRowsToContents(); mỗi lần. Tôi đã thay đổi điều này thành chỉ tự động thay đổi kích thước hàng đã được thêm vào ui-> messageLog-> resizeRowToContents (0) ;, và sự chậm chạp đã biến mất.

0

Tôi đang sử dụng 80000 hàng và có vấn đề tương tự khi thêm số lượng lớn các mục vào bảng.

Giải pháp của tôi là để cho nó phân bổ bộ nhớ nâng cao bằng cách cho biết cần bao nhiêu hàng.

Tôi đã sử dụng mẫu và mô hình Qtableview, vì vậy:

self.model.setRowCount (80000)

tôi chắc chắn rằng bạn có thể kết hợp này lên với mã của bạn

1

thử điều này:

   QSqlDatabase db =QSqlDatabase::addDatabase("QSQLITE"); 

     void SELECT_TO_TBLWID(QTableWidget * TBL, QString DbPath,QString SQL) 
        { 
         QSqlDatabase db2 =QSqlDatabase::database(); 
         db2.setDatabaseName(DbPath); 
         if(!db2.open()) 
         { 
         qDebug() << db2.lastError(); 
         qFatal("Failed to connect."); 
         } 
         QSqlQuery qry; 
         qry.prepare(SQL); 
         if(!qry.exec()) 
          qDebug() << qry.lastError(); 
         else 
         { 
          QSqlRecord rec = qry.record(); 

          TBL->setColumnCount(rec.count()); 
          int RW=0; 
          for(int r=0; qry.next(); r++) 
           {RW++;} 
           TBL->setRowCount(RW); 
           for (int pr=RW;qry.previous();pr--){// do nothing} 

         for(int r=0; qry.next(); r++) 
          { 

           for(int c=0; c<rec.count(); c++) 
           { 
            if (r==0) 
            { 
             TBL->setHorizontalHeaderItem(c,new QTableWidgetItem(rec.fieldName(c))); 
            } 

           TBL->setItem(r, c, new QTableWidgetItem(qry.value(c).toString())); 

           } 

          } 
         } 

         db2.close(); 
       } 
+2

Mặc dù mã này có thể giúp giải quyết vấn đề, nó không giải thích _why_ và/hoặc _how_ nó trả lời câu hỏi. Việc cung cấp ngữ cảnh bổ sung này sẽ cải thiện đáng kể giá trị lâu dài của nó. Vui lòng [sửa] câu trả lời của bạn để thêm giải thích, bao gồm những giới hạn và giả định được áp dụng. –

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