2011-11-15 27 views
5

Tôi có một QListView được chọn nhiều lựa chọn với một đại biểu mục (QStyledItemDelegate) tôi sử dụng để thiết lập kích thước cho các mục và làm tùy chỉnh sơn. Yêu cầu của tôi rất đơn giản:QTListView với mục đại biểu - Hàng mục cao hơn cho các mục đã chọn

  1. Row chiều cao 30 cho các mục đã chọn không
  2. Row chiều cao 60 cho các mục đã chọn

Không thể có được điều này để làm việc.

Cố gắng sử dụng sizeHint trên QStyledItemDelegate tôi

if (option.state & QStyle::State_Selected) 
{ 
    return QSize(100,60); /// <<<<------ NEVER REACHED 
} 
else 
{ 
    return QSize(100,30); 
} 

Nhà nước không bao giờ được chọn là kỳ lạ bởi vì cùng một câu lệnh if hoạt động hoàn hảo cho phương pháp vẽ tranh trên cùng lớp, phân biệt giữa hàng lựa chọn và không được chọn hàng cho nền sơn khác nhau.

Sau đó, tôi đã cố gắng cái gì khác

tôi đã lựa chọn mô hình (QItemSelectionModel) tiếp cận với phương pháp sizeHint trên đại biểu của tôi. Sử dụng này tôi có thể truy vấn thành công nếu hàng sizehint được gọi là được chọn hay không và tôi đang trả lại kích thước chính xác. Tuy nhiên bây giờ chỉ có bản vẽ được thực hiện theo đúng kích thước biến. đối với các mục đã chọn, bản vẽ hiện có chiều cao là 60, chính xác nhưng nó chồng lên các mục bên dưới nó. Nói cách khác: kích thước sizeHint mới chỉ được sử dụng cho BẢN V 01, nhưng không thực sự làm cho mục QListView cao hơn. Có vẻ như có một cuộc gọi bị thiếu để "cập nhật" listView rằng một trong các mục của nó đã thay đổi về kích thước. Tôi không cần phải vẽ vật phẩm cao hơn, tôi cần vật phẩm để cao hơn cho mục đích đó.

Dường như sizeHint chỉ có ảnh hưởng đến chiều cao mục khi bắt đầu khi mọi thứ được khởi tạo. nếu bạn bất ngờ trả về giá trị độ cao cao hơn cho một trong các mục từ sizeHint của bạn - nó sẽ không tăng thêm chế độ xem danh sách để phù hợp với chiều cao mới.

Một thú vị quan sát:

Nếu tôi đặt setResizeMode (QListView :: Điều chỉnh) trên QListView tôi, một thay đổi kích thước nhỏ để điều khiển sẽ kích hoạt một tái calc của tất cả các mặt hàng, sửa chữa các kích thước của mục được chọn thực tế như bản vẽ (luôn được thực hiện ở độ cao chính xác) không xếp chồng lên mục bên dưới vì chiều cao mục bây giờ là chính xác. Đây là những gì tôi cần làm như thay đổi lựa chọn, gây ra một "tái calc" như QLiustView :: Điều chỉnh nguyên nhân. Làm thế nào để làm điều đó?

Điều tôi đang làm bây giờ là xấu, và tôi tích cực không phải là cách để làm điều này, nhưng tôi không có lựa chọn thay thế nào khác. Tôi đang hooking vào mô hình lựa chọn - lắng nghe những thay đổi lựa chọn, và khi họ đến, tôi thay đổi kích thước chiều cao QlistView của tôi bằng 1 và sau đó quay trở lại kích thước ban đầu. Điều này tạo ra một sự tính toán lại các kích thước của item (setResizeMode (QListView :: Adjust) và mọi thứ đều trông và hoạt động tốt Tôi chỉ cảm thấy buồn nôn vì phải làm điều này-- không có cách nào tốt hơn để khiến các item phải tái calc chiều cao của chúng bằng cách giả mạo một kích thước của QListView?

Trả lời

1

Xác nhận với các nhà phát triển hàng đầu Nokia Qt - Các hack tôi đang làm dường như là cách duy nhất để có được điều này thực hiện:

Những gì tôi đang làm bây giờ là xấu xí, và tôi khẳng định đó là không phải cách để làm điều này, nhưng tôi không có cách nào khác. Tôi đang hooking lên để lựa chọn mô hình - lắng nghe về các thay đổi lựa chọn, và khi họ đến, tôi thay đổi kích thước chiều cao QlistView của tôi bằng 1 và sau đó quay trở lại kích thước ban đầu. Điều này tạo ra một tính toán lại các kích thước mục (setResizeMode (QListView :: Điều chỉnh) và tất cả mọi thứ có vẻ và hoạt động tốt.

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