Cómo mostrar texto parcialmente en negrita en QListWidgetItem con QtCore.Qt.UserRole

Quiero mostrar una sola palabra en una fuente QListWidgetItem en negrita. De acuerdo con esta publicación relacionada , debería ser posible usar QtCore.Qt.UserRole para este propósito. Sin embargo, el código de ejemplo proporcionado no funcionó para mí. (Ya que soy un principiante, lo más probable es que haya olvidado una definición, pero no sé cuál).

Esto es lo que tengo hasta ahora:

main.ui

   Dialog    0 0 341 244    Dialog     10 10 321 231             

test.py

 import os import sys from PyQt5 import QtCore, uic from PyQt5.Qt import QApplication, QDialog, QListWidgetItem class GUI(QDialog): def __init__(self): super(GUI, self).__init__() dirname = os.path.dirname(os.path.abspath(__file__)) uic.loadUi(os.path.join(dirname,'main.ui'), self) # this doesn't work for ordinal in ['first', 'second', 'third']: item = QListWidgetItem() item.setData(QtCore.Qt.UserRole, 'This is the {} word.'.format(ordinal)) self.lwOptions.addItem(item) for ordinal in ['fourth', 'fifth', 'sixth']: item = QListWidgetItem('This is the {} word.'.format(ordinal)) self.lwOptions.addItem(item) if __name__ == '__main__': app = QApplication(sys.argv) window = GUI() window.show() sys.exit(app.exec_()) 

Cuando ejecuto el código, agregaré tres líneas vacías y tres líneas con los mensajes literales.

¿Cuál es la syntax correcta de QtCore.Qt.UserRole ?

>= Qt::UserRole no usa los roles >= Qt::UserRole manera predeterminada, por lo que puede usarse para cualquier propósito, por ejemplo, para guardar información adicional, en este caso no es la solución. Una posible solución es usar un delegado para representar el HTML.

 import os import html from PyQt5 import QtCore, QtGui, QtWidgets, uic class HTMLDelegate(QtWidgets.QStyledItemDelegate): def __init__(self, parent=None): super(HTMLDelegate, self).__init__(parent) self.doc = QtGui.QTextDocument(self) def paint(self, painter, option, index): painter.save() options = QtWidgets.QStyleOptionViewItem(option) self.initStyleOption(options, index) self.doc.setHtml(options.text) options.text = "" style = QtWidgets.QApplication.style() if options.widget is None \ else options.widget.style() style.drawControl(QtWidgets.QStyle.CE_ItemViewItem, options, painter) ctx = QtGui.QAbstractTextDocumentLayout.PaintContext() if option.state & QtWidgets.QStyle.State_Selected: ctx.palette.setColor(QtGui.QPalette.Text, option.palette.color( QtGui.QPalette.Active, QtGui.QPalette.HighlightedText)) else: ctx.palette.setColor(QtGui.QPalette.Text, option.palette.color( QtGui.QPalette.Active, QtGui.QPalette.Text)) textRect = style.subElementRect(QtWidgets.QStyle.SE_ItemViewItemText, options, None) if index.column() != 0: textRect.adjust(5, 0, 0, 0) constant = 4 margin = (option.rect.height() - options.fontMetrics.height()) // 2 margin = margin - constant textRect.setTop(textRect.top() + margin) painter.translate(textRect.topLeft()) painter.setClipRect(textRect.translated(-textRect.topLeft())) self.doc.documentLayout().draw(painter, ctx) painter.restre() def sizeHint(self, option, index): return QtCore.QSize(self.doc.idealWidth(), self.doc.size().height()) class GUI(QtWidgets.QDialog): def __init__(self): super(GUI, self).__init__() dirname = os.path.dirname(os.path.abspath(__file__)) uic.loadUi(os.path.join(dirname,'main.ui'), self) delegate = HTMLDelegate(self.lwOptions) self.lwOptions.setItemDelegate(delegate) for ordinal in ['first', 'second', 'third', 'fourth', 'fifth', 'sixth']: item = QtWidgets.QListWidgetItem('This is the {} word.'.format(ordinal)) self.lwOptions.addItem(item) if __name__ == '__main__': import sys app = QtWidgets.QApplication(sys.argv) window = GUI() window.show() sys.exit(app.exec_()) 

introduzca la descripción de la imagen aquí