Установить жирный ряд в QTreeView - PullRequest
2 голосов
/ 23 апреля 2010

У меня есть собственный подкласс QTreeView в приложении pyqt.Я пытаюсь дать пользователю возможность выделять и «подсвечивать» (из-за отсутствия лучшего термина) строки.Выделенные строки должны иметь жирный текст и (необязательно) другой цвет фона.Любые идеи?
Я рассматриваю StyleSheets как вариант, но до сих пор не смог заставить это работать.Если я установлю таблицу стилей QTreeView:

self.setStyleSheet("QTreeView::item:selected {border: 1px solid #567dbc;}")

, я не смогу понять, как вручную включить «состояния», которые бы сохраняли только нужные строки в определенном состоянии.Если я попытаюсь установить таблицу стилей для отдельного элемента:

#modelIndex is a valid QModelIndex
modelIndex.internalPointer().setStyleSheet()

, я получу сегфоут.
Я не уверен, что таблицы стилей - это путь, я открыт для всех идей.Спасибо!

Ответы [ 2 ]

6 голосов
/ 24 апреля 2010

Из того, что вы сказали, похоже, что самым простым решением было бы определить пользовательский делегат элемента для вашего дерева и установить вес шрифта элементов жирным шрифтом, когда это необходимо.Пожалуйста, проверьте, будет ли работать приведенный ниже пример, он должен создать древовидное представление с пользовательским делегатом элемента, который изменит стиль шрифта элемента.

import sys
from PyQt4 import QtGui, QtCore

class BoldDelegate(QtGui.QStyledItemDelegate):
    def paint(self, painter, option, index):
        # decide here if item should be bold and set font weight to bold if needed 
        option.font.setWeight(QtGui.QFont.Bold)
        QtGui.QStyledItemDelegate.paint(self, painter, option, index)


class MainForm(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(MainForm, self).__init__(parent)

        model = QtGui.QStandardItemModel()

        for k in range(0, 4):
            parentItem = model.invisibleRootItem()
            for i in range(0, 4):
                item = QtGui.QStandardItem(QtCore.QString("item %0 %1").arg(k).arg(i))
                parentItem.appendRow(item)
                parentItem = item

        self.view = QtGui.QTreeView()
        self.view.setModel(model)
        self.view.setItemDelegate(BoldDelegate(self))

        self.setCentralWidget(self.view)

def main():
    app = QtGui.QApplication(sys.argv)
    form = MainForm()
    form.show()
    app.exec_()

if __name__ == '__main__':
    main()

надеюсь, это поможет, с уважением

3 голосов
/ 23 апреля 2010

Я могу придумать несколько способов сделать это.Проще всего, если у вас есть доступ к модели, это добавить отслеживание состояния индексов в модели и вернуть правильные параметры для ролей, запрошенных в функции data ().Недостаток этого заключается в том, что если вы используете одну и ту же модель в разных представлениях и хотите сохранить выделенные участки локально для одного представления.

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

Сложнее всего создать пользовательский делегат, который отслеживает, какие строки / столбцы должныбыть выделенным, и рисует себя по-разному в зависимости от строки / столбца модельного индекса, который он рисует.Вам нужно будет сохранить доступ к делегату, чтобы вы могли сказать ему, какие строки и столбцы должны быть установлены.Вам также необходимо разобраться с тем, что происходит при изменении модели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...