Разрыв строки в QTableView

У меня есть QTableView в моем графическом интерфейсе, в котором я хочу иметь несколько ячеек таблицы, в которые я могу вставлять разрывы строк, используя что-то вроде \n или же <br>, До сих пор я пытался установить QLabel в качестве IndexWidget:

l = QLabel(val[2])
self.setRowHeight(i, int(l.height() / 8))
l.setAutoFillBackground(True)
self.setIndexWidget(QAbstractItemModel.createIndex(self.results_model, i, 2), l)

Проблема с этим подходом состоит в том, что код не очень чистый и не может быть просто выполнен в AbstractTableModel без этого кода, чтобы заменить ячейку виджетом. Вторая проблема заключается в том, что при выборе строки с виджетом в ней синяя подсветка не применяется к ячейке. Другая проблема заключается в том, что метод resizeRowsToContents() не учитывает высоту этого виджета.

Любые идеи будут очень признательны, спасибо!

1 ответ

Решение

Одним из способов реализации этой задачи является использование HtmlDelegate, в этом случае разрыв строки будет дан <br>:

import sys

from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *

class HTMLDelegate(QStyledItemDelegate):
    def paint(self, painter, option, index):
        opt = QStyleOptionViewItem(option)
        self.initStyleOption(opt, index)

        painter.save()
        doc = QTextDocument()
        doc.setHtml(opt.text)
        opt.text = "";
        style = opt.widget.style() if opt.widget else QApplication.style()
        style.drawControl(QStyle.CE_ItemViewItem, opt, painter)
        painter.translate(opt.rect.left(), opt.rect.top())
        clip = QRectF(0, 0, opt.rect.width(), opt.rect.height())
        doc.drawContents(painter, clip)
        painter.restore()

    def sizeHint(self, option, index ):
        opt = QStyleOptionViewItem(option)
        self.initStyleOption(opt, index)
        doc = QTextDocument()
        doc.setHtml(opt.text);
        doc.setTextWidth(opt.rect.width())
        return QSize(doc.idealWidth(), doc.size().height())

if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = QTableView()
    model = QStandardItemModel(4, 6)
    delegate = HTMLDelegate()
    w.setItemDelegate(delegate)
    w.setModel(model)
    w.verticalHeader().setSectionResizeMode(QHeaderView.ResizeToContents)
    w.show()
    sys.exit(app.exec_())

введите описание изображения здесь

Другие вопросы по тегам