Невозможно установить флажок внутри TreeView - PullRequest
1 голос
/ 21 марта 2011

Я попытался создать древовидное представление с флажками, но не могу установить флажки.

в методе флага Я упомянул его как ItemisuserCheckable, но все еще не смог заставить его работать ...

Я что-то здесь упускаю, чтобы включить выбор флажков.

Фрагмент кода:

import sys

from PyQt4.QtCore import *
from PyQt4.QtGui import *

class StbTreeView(QAbstractListModel):
    def __init__(self, args, parent=None):
        super(StbTreeView, self).__init__(parent)

        self.args = args
        print self.args

    def rowCount(self, parent):
        return len(self.args)

    def headerData(self, section, orientation, role):
        if role == Qt.DisplayRole:
            if orientation == Qt.Horizontal:
                return QString("Select STB's")

    def flags(self, index):
        row = index.row()
        if row:
            return  Qt.ItemIsUserCheckable | Qt.ItemIsEnabled | Qt.ItemIsEditable | Qt.ItemIsSelectable

    def data(self, index, role=Qt.DisplayRole):

        if role == Qt.DisplayRole:
            row = index.row()
            return self.args[row]

        if role == Qt.CheckStateRole:

            row = index.row()
            return QVariant(Qt.Unchecked)

    def setData(self, index, value, role):

        if role == Qt.CheckStateRole:
            if value == Qt.Checked:
                row = index.row()
                selected_stb = self.args[row]
                print 'selected_stb is %s' % selected_stb
                print 'Value is %s' % value
                self.emit(SIGNAL("dataChanged(QModelIndex,QModelIndex)"),index, index)
                return True
            #return QVariant(Qt.Checked)

def main():
    myapp = QApplication(sys.argv)

    data = ['STB1', 'STB2', 'STB3', 'STB4', 'STB5', 'STB6', 'STB7', 'STB8']

    model = StbTreeView(data)
    tree_view = QTreeView()
    tree_view.show()
    tree_view.setModel(model)

    myapp.exec_()

if __name__ == '__main__':
    main()

Ответы [ 2 ]

3 голосов
/ 22 марта 2011

вам нужно где-то хранить текущее состояние элемента (проверено \ не отмечено) и изменять его при вызове метода setdata (). Ваши элементы всегда не проверяются, потому что вы всегда возвращаете QVariant(Qt.Unchecked) для них в методе data ().

Я немного изменил ваш код, видите, он будет работать для вас:

import sys

from PyQt4.QtCore import *
from PyQt4.QtGui import *

class TestItem():
    def __init__(self, name, checked):
        self.checked = checked
        self.name = name

class StbTreeView(QAbstractListModel):
    def __init__(self, args, parent=None):
        super(StbTreeView, self).__init__(parent)

        self.args = []
        for item_name in args:
            self.args.append(TestItem(item_name, False))

        for item in self.args:
            print item.name

    def rowCount(self, parent):
        return len(self.args)

    def headerData(self, section, orientation, role):
        if role == Qt.DisplayRole:
            if orientation == Qt.Horizontal:
                return QString("Select STB's")

    def flags(self, index):
        return  Qt.ItemIsUserCheckable | Qt.ItemIsEditable | Qt.ItemIsSelectable | Qt.ItemIsEnabled

    def data(self, index, role=Qt.DisplayRole):
        if role == Qt.DisplayRole:
            row = index.row()
            print self.args[row].name
            return self.args[row].name

        if role == Qt.CheckStateRole:
            row = index.row()
            print self.args[row].checked
            if self.args[row].checked == False:
                return QVariant(Qt.Unchecked)
            else:
                return QVariant(Qt.Checked)

    def setData(self, index, value, role):
        if role == Qt.CheckStateRole:
            row = index.row()
            self.args[row].checked = not self.args[row].checked             
        return True

def main():
    myapp = QApplication(sys.argv)

    data = ['STB1', 'STB2', 'STB3', 'STB4', 'STB5', 'STB6', 'STB7', 'STB8']

    model = StbTreeView(data)
    tree_view = QTreeView()
    tree_view.show()
    tree_view.setModel(model)

    myapp.exec_()

if __name__ == '__main__':
    main()

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

0 голосов
/ 22 марта 2011

Спасибо, это действительно сработало для меня. Моим первоначальным требованием было назвать этот вид / модель в поле со списком. Я попытался вызвать это, но это не сработало ... Я могу видеть представление внутри поля со списком, но не могу установить ни один из флажков. Я попробовал довольно много возможностей, но не удалось ..

Внесены небольшие изменения в код для вызова из поля со списком.

модифицированный код:

import sys

from PyQt4.QtCore import *
from PyQt4.QtGui import *

class TestItem():
    def __init__(self, name, checked):
        self.checked = checked
        self.name = name

class StbTreeView(QAbstractListModel):
    def __init__(self, args, parent = None):
        super(StbTreeView, self).__init__(parent)

        self.args = []
        for item_name in args:
            self.args.append(TestItem(item_name, False))

        for item in self.args:
            print item.name

    #print 'Value of self.args is %s' % self.args

    def rowCount(self, parent):
        return len(self.args)

    def headerData(self, section, orientation, role):
        if role == Qt.DisplayRole:
            if orientation == Qt.Horizontal:
                return QString("Select STB's")

    def flags(self, index):
        return  Qt.ItemIsUserCheckable | Qt.ItemIsEditable | Qt.ItemIsSelectable | Qt.ItemIsEnabled

    def data(self, index, role=Qt.DisplayRole):
        if role == Qt.DisplayRole:
            row = index.row()
            print self.args[row].name
            return self.args[row].name

        if role == Qt.CheckStateRole:
            row = index.row()
            print self.args[row].checked
            if self.args[row].checked == False:
                return QVariant(Qt.Unchecked)
            else:
                return QVariant(Qt.Checked)

    def setData(self, index, value, role):
        if role == Qt.CheckStateRole:
            row = index.row()
            self.args[row].checked = not self.args[row].checked             
        return True

class Template(QTreeView):
    def __init__(self, parent=None):
        super(Template, self).__init__(parent)

        self.data = ['STB1', 'STB2', 'STB3', 'STB4', 'STB5', 'STB6', 'STB7', 'STB8']
        self.MainUI()

    def MainUI(self):
        self.model = StbTreeView(self.data)
        self.setModel(self.model)


def main():
    myapp = QApplication(sys.argv)
    temp = Template()
    temp.show()
    myapp.exec_()

if __name__ == '__main__':
    main()

Код из поля со списком:

stb_listview = QComboBox()
view = Template()
stb_listview.setView(view)
stb_listview.setModel(view.model)
...