Как определить, для чего импортировать, например, совпадающие флаги, используемые с QTreeWidget.FindItems?

#python #python-3.x #pyqt5

#python #python-3.x #pyqt5

Вопрос:

Я пытаюсь использовать функцию QTreeWidget.FindItems, чтобы найти точное соответствие (элемент называется «Вещи») Я видел пример, использующий этот … Qt.MatchExactly … в качестве ‘флага соответствия’. несмотря на то, что я импортировал модуль Qt из PyQt5, совпадение точно не было найдено. Я заставил это работать, импортировав ДРУГОЙ модуль Qt, найденный в QtCore, в PyQt5. но это было после многих часов в течение нескольких дней поиска, угадывания и чтения сообщений StackOverflow.

Мой вопрос — как узнать, какой модуль содержит (и, следовательно, должен быть импортирован) нужные мне материалы? откуда мне знать, что Qt.Совпадение действительно находится в модуле PyQt5.QtCore.Qt (а НЕ в модуле PyQt5.Qt)?

Это мой код: Обратите внимание, что он считывается в файле QtDesigner .ui, поэтому у вас это не сработает. но смысл не в том, чтобы вы запускали этот код.

 import sys
from PyQt5.QtWidgets import *
from PyQt5.QtWidgets import QMainWindow, QApplication, QTreeWidgetItem
from PyQt5 import uic, QtWidgets, Qt #<<flags are not here
from PyQt5 import QtCore

from PyQt5.QtCore import Qt #<<<this is where i found the match flag "MatchExactly"

qtCreatorFile = "Main2.ui" # Enter qt Designer file here.
Ui_MainWindow, QtBaseClass = uic.loadUiType(qtCreatorFile)

class MyApp(QMainWindow):
    def __init__(self):
        super(MyApp, self).__init__()
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)       

        self.InitModelContentTree()

    def InitModelContentTree (self):
        modelContentTree = self.ui.ModelContentTree
        ThingsItemList = modelContentTree.findItems("Things", Qt.MatchExactly)
        ThingsItem = ThingsItemList[0]
        QTreeWidgetItem(ThingsItem, ["New Thing"])
        print("pause")


if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MyApp()
    window.show()
    sys.exit(app.exec_())
  

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

Ответ №1:

На самом деле Qt.Совпадение действительно есть в Qt, но вы должны импортировать его другим способом:

 from PyQt5 import Qt

# ...

ThingsItemList = modelContentTree.findItems("Things", Qt.Qt.MatchExactly)
  

TL; DR

Подмодуль Qt — это поддельный модуль, который разрешает доступ к любому модулю, такому как псевдоним, например, он похож на:

 from PyQt5 import QtCore as Qt
from PyQt5 import QtGui as Qt
from PyQt5 import QtWidgets as Qt
# ...
# The same for all submodules
  

Например, это можно проверить на Qt.Точно соответствовать:

 from PyQt5 import Qt, QtCore

assert(QtCore.Qt.MatchExactly == Qt.Qt.MatchExactly)
  

Итак, в общем, следующий импорт:

 from PyQt5 import somemodule

somemodule.someclass
  

Это эквивалентно:

 from PyQt5 import Qt

Qt.someclass
  

Как узнать, к какому подмодулю принадлежит класс?: Ну, если у вас есть IDE, которая может создавать самоотчет, подобный pycharm, задача проста, поскольку IDE сама это делает. Но если у меня нет доступа к IDE, другой вариант — использовать документы Qt, например, документы Qt::MatchExactly находится по этой ссылке, которая в первой части представляет собой следующую таблицу:

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

И обратите Qt = core внимание, что все элементы этих документов принадлежат основному подмодулю Qt, который в PyQt / PySide соответствует QtCore (в общем случае, если документы Qt указывают Qt = mymodule в PyQt / PySide в QtMyModule ).Также Qt::MatchExactly из C соответствует Qt.MatchExactly в python. Итак, в заключение вы должны использовать:

 from PyQt5 import QtCore

QtCore.Qt.MatchExactly