Как остановить каждый третий QLineEdit в моем GUI от взлома? - PullRequest
0 голосов
/ 06 июня 2019

В настоящее время я нахожусь в процессе создания графического интерфейса, подобного калькулятору, с использованием PyQt5 и Python 3.7, и столкнулся с проблемой, при которой каждый третий QLineEdit на каждой вкладке калькулятора отказывается взаимодействовать. Более того, пользовательские объекты меток, которые я использую для обозначения каждого третьего QLineEdits, также отказываются отображать подсказки. Все остальные QLineEdits доступны для редактирования, а все остальные метки отображают свои всплывающие подсказки, как и положено, разрывается только каждая третья строка.

Мои попытки решить проблему были относительно ограниченными, потому что я не вижу никакой причины, почему именно каждый третий QLineEdit делал бы это вместо всех них. Единственное, о чем я мог подумать, это использовать text_box.setReadOnly(False), но это не имело никакого эффекта.

Вот класс, который действует как контейнерный виджет для входных данных:

class Component(QtWidgets.QWidget):
    def __init__(self, link_component, omit_fields = []):
        super().__init__()
        self.l = QtWidgets.QGridLayout()
        self.setLayout(self.l)

        self.link_component = type(link_component)
        self.field_dict = {}
        self.label_dict = {}

        # Iterate over fields
        for field_idx, field in enumerate([f for f in vars(link_component) if not f.startswith('__')]):
            # Add text box and label
            text_box = QtWidgets.QLineEdit(str(getattr(link_component, field)))
            text_box.setMaximumSize(config["gui"]["text_box_width"], config["gui"]["text_box_height"])
            text_box.setReadOnly(False)
            self.l.addWidget(text_box, field_idx, 0)
            label = Label(config["gui"]["component_labels"][type(link_component).__name__][str(field)])
            self.l.addWidget(label, field_idx, 1)
            self.field_dict[str(field)] = text_box
            self.label_dict[str(field)] = label

        # add spacer widget
        self.l.addWidget(QtWidgets.QWidget(), 2, 0, 1, 10)
        self.l.addWidget(QtWidgets.QWidget(), 0, len(self.field_dict), 10, 1)

Вот код, который я использую для генерации вкладок, содержащих каждый «компонентный» объект:

        for idx, (name, c) in enumerate(self.components.items()):
            component_title = config["gui"]["component_labels"][c.link_component.__name__]["title"]

            for (field_name, field) in c.field_dict.items():
                field.returnPressed.connect(self.analysis_button.click)  # Enter clicks the analysis button

            for (label_name, label) in c.label_dict.items():
                label.setToolTip(config["gui"]["component_labels"][c.link_component.__name__]["tooltips"][label_name])

            self.component_tabs.addTab(c, component_title)
            self.component_tabs.setTabToolTip(idx, config["gui"]["component_labels"][c.link_component.__name__]
                                              ["component_tooltip"])

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

class Label(QtWidgets.QLabel):
    def __init__(self, *args, **kwargs):
        super(Label, self).__init__(*args, **kwargs)
        self.setMouseTracking(True)

    def enterEvent(self, event):
        QtWidgets.QToolTip.showText(
            self.mapToGlobal(event.pos()), self.toolTip()
        )
        super(Label, self).enterEvent(event)

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

...