2011-11-23 28 views
5

Tôi rất mới đối với PyQT và QT nói chung và phải nhanh chóng thiết kế giao diện người dùng tương tự như ứng dụng thư 2 ngăn hiện đại: để lại danh sách thư, phải chỉnh sửa. Tôi muốn cung cấp thêm một chút thông tin hơn là chỉ một Chuỗi để hiển thị trong QListView - về cơ bản là tên mục in đậm văn bản, bên dưới hai dòng có mô tả theo một kiểu khác và trên cùng bên trái một tập hợp thẻ giống danh hiệu. Hơn nữa, danh sách sẽ phải cập nhật sau vài giây hoặc lâu hơn (có khả năng chỉ thay đổi rất ít mục), vì vậy tôi không muốn ghi lại dữ liệu mỗi lần.Các mục tùy chỉnh trong QListView

Từ những gì tôi đọc trong các hướng dẫn và hướng dẫn khác nhau, có nhiều cách khác nhau để hoàn thành điều đó và tôi không chắc phương thức được sử dụng phổ biến nhất là gì (người khác sẽ phải làm việc với mã sau khi tôi soạn thảo lõi ứng dụng) - đối tượng và phương thức nào bạn sẽ sử dụng - QListView hoặc QListWidget và sau đó phân lớp QAbstractListModel hoặc QStandardItemModel, ...?

Trả lời

4

Nếu bạn không muốn nghĩ về mô hình của mình hoặc chia sẻ thực sự là giữa các lượt xem, thì QListWidget có nghĩa là cho mục đích đó. Bạn chỉ cần xử lý Danh sách trực tiếp và dữ liệu được lưu trữ trong mô hình cơ bản của riêng nó. Đối với một QListWidget, bạn có thể sử dụng: QListWidget.setItemWidget(QListWidgetItem item, QWidget widget) Điều đó sẽ kéo theo bạn tạo tiện ích con của riêng bạn theo cách bạn muốn, có QLabels cho văn bản và bản đồ pixmap của bạn. Sau đó, bạn sẽ thêm chúng vào QListWidget bằng cách thực hiện:

# create item widget 
item = QListWidgetItem() 
w = CustomItemWidget() 
w.setTitle = "Title" 
w.setDescription = "Blah blah" 
# would have a QPixmap already cached 
w.setBadgeImage = preCreatedPixmaps['thisBadge'] 
listWidget.insertItem(item) 
listWidget.setItemWidget(item, w) 

Mặt khác là bạn có thể kiểm soát giao diện đơn giản mà không cần phải viết một đại biểu phức tạp hơn. Nhược điểm của phương pháp này là bạn không thực sự chia sẻ mô hình với chế độ xem khác và bạn phải quản lý việc tạo tiện ích khi cần thêm các mục mới. Và phương pháp này giả định các hiển thị widget sẽ là tĩnh. Họ không muốn được thay đổi sau khi họ được thiết lập. Nó cũng có thể chậm hơn nếu bạn có hàng ngàn người trong số họ.

Tạo một Đại biểu cho các hạng mục của bạn trong một QListView là một cách tiếp cận nhanh hơn từ một quan điểm hiệu suất, nhưng một chút kỹ thuật thêm ...

Xem ở đây cho một ví dụ (mặc dù trong nó C++ nhưng dễ hiểu http://www.qtcentre.org/threads/27777-Customize-QListWidgetItem-how-to?p=131746#post131746

Một ví dụ khác trong python, mặc dù mã không có indents tab: http://www.qtcentre.org/archive/index.php/t-31029.html

2

Nếu người dùng không thay đổi dữ liệu trong danh sách thư theo cách thủ công, bạn có thể dễ dàng sử dụng một trong các lớp mô hình với tùy chỉnh QStyledItemDelegate (hoặc QAbstractItemDelegate). Hãy xem ví dụ trong tài liệu QAbstractItemDelegate được liên kết ở trên cũng như ví dụ Star Delegate.

Nếu người dùng cần thay đổi dữ liệu nội tuyến trong danh sách thư và danh sách e-mail đủ khác với tiện ích chuẩn, sẽ trở nên khó khăn hơn một chút để đảm bảo trình chỉnh sửa trông tương tự như chế độ xem bản trình bày. Nó không phải là không thể, nhưng đó là một trong những phần khó khăn hơn.

Bạn có thể lấy đi bằng cách sử dụng QStandardItemModel. Nhưng ... Tôi thường khuyên bạn nên tạo một mô hình tên miền với một Qt (trong trường hợp của bạn, QAbstractListModel) wrapper cho bất cứ điều gì không tầm thường.

+0

Một số trong các liên kết được cung cấp là chết – user1767754

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