2011-10-31 29 views
6

Tôi đã một QTableWidget mà tôi cư như thế này:Strange QTableWidget hành vi - không phải tất cả các tế bào dân sau khi phân loại tiếp theo repopulating

// Clear the table 
    this->topPatchesTableWidget->setRowCount(0); 

    this->topPatchesTableWidget->setRowCount(numberToDisplay); 
    for(unsigned int pairId = 0; pairId < numberToDisplay; ++pairId) 
    { 
    // Display patch match scores 
    QTableWidgetItem* myLabel = new QTableWidgetItem; 
    myLabel->setData(Qt::DisplayRole, myValues[pairId]); 
    this->tableWidget->setItem(pairId, 0, myLabel); 
    ... fill other columns ... 
    } 

(Tôi có một số yếu tố giao diện người dùng khác để thiết lập thuộc tính tính toán các giá trị trong myValues) . Nếu tôi thay đổi các thuộc tính, tính toán lại và tạo lại bảng, mọi thứ sẽ hoạt động như mong đợi. Nếu tôi sắp xếp bảng bằng cách nhấp vào một trong các tiêu đề, nó sẽ sắp xếp chính xác. BAO GIỜ, nếu vào thời điểm này (sau khi phân loại) tôi bấm vào nút của tôi một lần nữa để tính lại các giá trị và tạo lại bảng, bảng rất bị hỏng. Nghĩa là, nhiều ô trống rỗng và các ô không trống rỗng dường như không theo thứ tự cụ thể nào.

Bằng cách thêm một cuộc gọi bằng tay để

this->tableWidget->sortByColumn(0, Qt::AscendingOrder); 

vào đầu chức năng CreateTable của tôi, mọi thứ hoạt động như mong đợi, nhưng tất nhiên bảng mới được tạo ra được sắp xếp theo cột 0 chứ không phải cột đã được chọn để loại cuối cùng.

Có ai có bất kỳ ý tưởng nào về việc tại sao mọi thứ sẽ trở nên quá sai khi không có cuộc gọi đến sortByColumn? (Tôi đã cố gắng để làm một ví dụ đơn giản nhưng tôi không thể nhân rộng vấn đề trong một chương trình demo).

Cảm ơn,

David

Trả lời

12

Tôi đã gặp vấn đề tương tự trong python, nếu tiêu đề cột được chọn để cho phép sắp xếp các ô sau khi cột đó ngừng hoạt động.

Tôi đã giải quyết nó bằng cách đặt self.tableWidget.setSortingEnabled (False) ở đầu hàng thêm phương thức, sau đó đặt lại thành self.tableWidget.setSortingEnabled (True) ở cuối hàng thêm phương thức. Theo số riverbank computing, đây là cách được đề xuất chính thức để giải quyết vấn đề này.

QTableWidget.setItem(tự, int hàng, int cột, QTableWidgetItem mục)

Lưu ý rằng nếu phân loại là kích hoạt (xem sortingEnabled) và cột là cột sắp xếp hiện tại , hàng sẽ được di chuyển đến vị trí được sắp xếp theo mục.

Nếu bạn muốn đặt một số mục của một hàng cụ thể (ví dụ, bằng cách gọi setItem() trong một vòng lặp), bạn có thể tắt sắp xếp trước khi làm như vậy và bật lại sau đó; điều này sẽ cho phép bạn sử dụng cùng một đối số hàng cho tất cả các mục trong cùng một hàng (tức là setItem() sẽ không di chuyển hàng).

Xem thêm mục() và takeItem().

+0

Điều này làm việc và tôi nghĩ rằng nên là câu trả lời cho câu hỏi này. Thử nghiệm trên QTableWidget bằng PyQt4. – ray

0

Tôi chưa bao giờ hình dung ra những gì là sai với điều này. Tôi đã từ bỏ và thực hiện một mô hình tùy chỉnh/xem mà có lẽ là một ý tưởng tốt hơn anyway.

+1

Karnisov cung cấp câu trả lời tốt hơn cho câu hỏi này. Tôi nghĩ bạn nên quay lại và chọn giải pháp của mình. – ray

1

tôi đã cùng một vấn đề - mọi khi, khi tôi muốn chèn dữ liệu mới, tôi buildet header và setSortingEnabled(true). Tôi đoán QTableWidget không giống như một số cuộc gọi cho setSortingEnabled(true). Vì vậy, tôi đặt nó vào constructor của MainWindown của tôi, và đó là nó!

0

Đây là một giải thích về câu trả lời của Karnisov, cũng với PyQt. Vô hiệu hóa sắp xếp trước khi thực hiện bất kỳ setItem() s cũng làm việc cho tôi, nhưng nó gây ra sắp xếp chọn của người dùng bị mất, vì vậy tôi đã làm điều đó như thế này, nơi t là một QTableWidget:

oldSort = t.horizontalHeader().sortIndicatorSection() 
oldOrder = t.horizontalHeader().sortIndicatorOrder() 
t.setSortingEnabled(False) 

# make the changes 

t.sortItems(oldSort, oldOrder) 
t.setSortingEnabled(True) 

Lưu ý rằng nó vẫn còn có thể cho sắp xếp thay đổi một chút với mã này. Điều này dường như là do các loại mà Qt được sử dụng ở đây không di chuyển bất kỳ mục mà đã ở trong trật tự, vì vậy nếu chúng ta có một bảng như thế này:

NUMBER LETTER OTHER LETTER 
    1   B    C 
    2   G    Q 
    3   A    Q 

Nếu chúng ta sắp xếp theo số, sau đó bởi THƯ KHÁC , không có gì thay đổi. Nhưng nếu chúng ta sắp xếp theo THƯ, sau đó bởi THƯ KHÁC, chúng tôi nhận được:

NUMBER LETTER OTHER LETTER 
    1   B    C 
    3   A    Q 
    2   G    Q 

Vì vậy, nếu trước đó chúng tôi đã sắp xếp theo THƯ, sau đó THƯ KHÁC, mã này sẽ chỉ làm một loại duy nhất bằng cách THƯ KHÁC, và chúng tôi d kết thúc với phiên bản thứ hai của bảng thay vì phiên bản đầu tiên (giả sử rằng thứ tự các phần tử được thêm vào bảng trong các kết quả phù hợp NUMBER). Ở vị trí này trong mã của tôi, tất cả các mục sẽ bị xóa và được thêm lại để làm mới bảng, do đó đôi khi có thể gây ra các thay đổi đáng chú ý theo thứ tự.

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