Как выполнить функцию при нажатии на пустую область QTreeWidget

#python #pyside2

#python #pyside2

Вопрос:

Я использую Python3.6 и PySide2

У меня есть treewidget-A, заполненный списком сотрудников. при нажатии на employee (treewidget-элемент) a будет заполнен другой TreeWidget-B.

Теперь, если я нажму на пустую область (отмените выбор элемента), но TreeWidget-B по-прежнему отображает сведения о последнем нажатом элементе сотрудника.

Это делается для заполнения элементов treewidget

 self.treeWidget_A.itemClicked.connect(self.populate_employee)
self.treeWidget_A.currentItemChanged.connect(self.populate_employee)
  

Как выполнить функцию clear_employee_data () при нажатии на пустую область QTreeWidget?

 def clear_employee_data(self):
    self.treeWidget_B.clear()
  

Ответ №1:

Вы должны определить щелчок и убедиться, что там нет элемента:

 from PySide2 import QtCore, QtWidgets

class TreeWidget(QtWidgets.QTreeWidget):
    emptyClicked = QtCore.Signal()

    def __init__(self, parent=None):
        super(TreeWidget, self).__init__(parent)
        for i in range(2):
            it = QtWidgets.QTreeWidgetItem(self, ["item-{}".format(i)])
            for j in range(3):
                child_it = QtWidgets.QTreeWidgetItem(it, ["item-{}-{}".format(i, j)])
        self.expandAll()

    def mousePressEvent(self, event):
        super(TreeWidget, self).mousePressEvent(event)
        if not self.indexAt(event.pos()).isValid():
            self.emptyClicked.emit()

@QtCore.Slot()
def on_empty_clicked():
    print("clicked")

if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    w = TreeWidget()
    w.emptyClicked.connect(on_empty_clicked)
    w.resize(640, 480)
    w.show()
    sys.exit(app.exec_())
  

В Qt Designer используйте eventfilter:

 from PySide2 import QtCore, QtGui, QtWidgets

from design import Ui_MainWindow

class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
    emptyClicked = QtCore.Signal()

    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.setupUi(self)
        self.treeWidget_A.viewport().installEventFilter(self)
        self.emptyClicked.connect(self.on_emptyClicked)

    def eventFilter(self, obj, event):
        if obj is self.treeWidget_A.viewport() and event.type() == QtCore.QEvent.MouseButtonPress:
            if not self.treeWidget_A.indexAt(event.pos()).isValid():
                self.emptyClicked.emit()
        return super(MainWindow, self).eventFilter(obj, event)

    @QtCore.Slot()
    def on_emptyClicked(self):
        print("empty")

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())
  

Комментарии:

1. Я использовал Qt Designer для рисования пользовательского интерфейса, а позже преобразовал пользовательский интерфейс в Py-файл с помощью Pyuic. Я не создавал класс Treewidget. Как я могу использовать этот пример?

2. @RajivSharma Какой шаблон вы использовали: главное окно, диалоговое окно или виджет?

3. QtWidgets. QMainWindow

4. Большое спасибо, теперь она работает! и еще раз спасибо installEventFilter, что полезно изучить.