PyQt QTreeView: Попытка подключения к сигналу selectionChanged - PullRequest
5 голосов
/ 12 ноября 2010

Я пытаюсь подключиться к сигналу selectionChanged QTreeView, используя PyQt. Я делал это в прошлом (для QTableView) и был успешным. Но сейчас я не могу заставить работать подобный код.

В следующем примере кода я успешно подключаюсь к развернутым и свернутым сигналам, но не к выделенным измененным или активированным сигналам. Может кто-нибудь сказать мне, что я делаю не так? Спасибо.

from PyQt4 import QtGui
from PyQt4 import QtCore

################################################################################
class ShaderDefTreeView(QtGui.QTreeView):
    """
    Overrides the QTreeView to handle keypress events.
    """

    #---------------------------------------------------------------------------
    def __init__(self, parent=None):
        """
        Constructor for the ShaderDefTreeView class.
        """
        super(ShaderDefTreeView, self).__init__(parent)

        #listen to the selectionChanged signal
        print "Connecting"

        #whenever the selection changes, let the data model know
        self.connect(self, 
                     QtCore.SIGNAL("selectionChanged(QItemSelection&, QItemSelection&)"),
                     self.store_current_selection)
        self.connect(self, QtCore.SIGNAL("activated(const QModelIndex &)"),
                     self.activated)
        self.connect(self, QtCore.SIGNAL("collapsed(const QModelIndex &)"),
                     self.collapsed)
        self.connect(self, QtCore.SIGNAL("expanded(const QModelIndex &)"),
                     self.expanded)


    #---------------------------------------------------------------------------
    def store_current_selection(self, newSelection, oldSelection):
        print "changed"
        #self.model().selection_changed(newSelection)


    #---------------------------------------------------------------------------
    def expanded(self, newSelection):
        print "expanded"


    #---------------------------------------------------------------------------
    def collapsed(self, newSelection):
        print "collapsed"


    #---------------------------------------------------------------------------
    def activated(self, newSelection):
        print "activated"

Ответы [ 2 ]

13 голосов
/ 12 ноября 2010

Хорошо, разобрался (в основном случайно).

Так как я делал подключения в init , но позже только устанавливал модель для этого QTreeView, не было допустимого selectionModelна месте.

Чтобы заставить его работать, мне нужно было сделать два изменения:

1) Излучающий объект должен был быть изменен, чтобы быть selectionTodel для QTreeView.Я не знаю почему, но некоторые (редкие) примеры в Интернете предположили, что это может иметь место

и

2) Мне пришлось переопределить метод setModel в QTreeView так, чтобыон вызывает метод setModel суперкласса, а затем устанавливает соединения.

Таким образом, новый код выглядит следующим образом:

class ShaderDefTreeView(QtGui.QTreeView):
    """
    Overrides the QTreeView to handle keypress events.
    """

    #---------------------------------------------------------------------------
    def __init__(self, parent=None):
        """
        Constructor for the ShaderDefTreeView class.
        """
        super(ShaderDefTreeView, self).__init__(parent)


    #---------------------------------------------------------------------------
    def setModel(self, model):
        super(ShaderDefTreeView, self).setModel(model)
        self.connect(self.selectionModel(),  
                     QtCore.SIGNAL("selectionChanged(QItemSelection, QItemSelection)"),  
                     self.store_current_selection) 


    #---------------------------------------------------------------------------
    def store_current_selection(self, newSelection, oldSelection):
        print "changed"
4 голосов
/ 21 ноября 2016

Если вы используете декларативный, вы можете сделать что-то вроде:

self.ui = uic.loadUi(main_path, self)
self.ui.tree.selectionModel().selectionChanged.connect(self.item_selection_changed_slot)
...