2011-11-23 15 views
5

Soy (muy) nuevo en PyQT y QT en general y tengo que diseñar rápidamente una interfaz de usuario que es muy similar a las modernas aplicaciones de correo de dos paneles: dejó una lista de correos, y un editor. Me gustaría dar un poco más de información que solo una cadena para mostrar en el QListView, básicamente el nombre de los elementos en negrita, debajo de dos líneas con una descripción en un estilo diferente y en la parte superior izquierda un conjunto de etiquetas. insignias. Además, la lista deberá actualizarse cada pocos segundos más o menos (probablemente con solo cambios en muy pocos elementos), por lo que no quiero volver a escribir los datos cada vez.Elementos personalizados en QListView

Por lo que he leído en los diversos manuales y tutoriales, hay diferentes maneras de lograrlo, y no estoy seguro de cuál es el método más utilizado (otras personas tendrán que trabajar con el código una vez que redacté el núcleo aplicación) - qué objetos y métodos usaría - QListView o QListWidget, y luego subclases QAbstractListModel o QStandardItemModel, ...?

Respuesta

4

Si no quiere pensar en su modelo, o realmente compartirlo es entre vistas, entonces un QListWidget es para ese propósito. Simplemente trata directamente con la Lista y los datos se almacenan en su propio modelo subyacente. Para un QListWidget, puede utilizar: QListWidget.setItemWidget(QListWidgetItem item, QWidget widget) Eso implicaría la creación de su propio widget que se ve de la manera que desea, con QLabels para su texto y pantallas de mapa de bits. De allí tendría que añadirlos a la QListWidget haciendo:

# 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) 

El lado positivo es que se puede controlar el aspecto de los artículos bastante sencilla sin tener que escribir un delegado más complicado. La desventaja de este enfoque es que realmente no comparte el modelo con otra vista y tiene que administrar la creación de widgets cuando se deben agregar nuevos elementos. Y este método supone que las visualizaciones del widget serán estáticas. No les gusta que los cambien después de que están listos. También puede ser más lento si tienes miles de ellos.

Creación de un delegado para sus artículos en un QListView es un enfoque más rápido desde el punto de vista de rendimiento, pero un poco más técnico ...

Vea aquí un ejemplo (aunque su en C++, pero fácil de entender http://www.qtcentre.org/threads/27777-Customize-QListWidgetItem-how-to?p=131746#post131746

Otro ejemplo en Python, aunque el código no tiene guiones de la ficha: http://www.qtcentre.org/archive/index.php/t-31029.html

2

Si los usuarios no están cambiando manualmente los datos en la lista de correos, entonces puede usar fácilmente una de las clases de modelo con un QStyledItemDelegate personalizado (o QAbstractItemDelegate). Observe el ejemplo en la documentación QAbstractItemDelegate vinculada anteriormente, así como el ejemplo Star Delegate.

Si los usuarios necesitan cambiar los datos en línea en la lista de correos, y la lista de correos electrónicos es suficientemente diferente de los widgets estándar, se vuelve bastante más difícil asegurarse de que el editor se vea lo suficientemente similar la vista de presentación No es imposible, pero esa es una de las piezas más difíciles.

Usted podría salirse con la suya usando un QStandardItemModel. Pero ... En general, recomiendo crear un modelo de dominio con un contenedor Qt (en su caso, QAbstractListModel) para cualquier cosa que no sea trivial.

+0

Algunos de los enlaces que están muertos – user1767754

Cuestiones relacionadas