В настоящее время я нахожусь в процессе создания графического интерфейса, подобного калькулятору, с использованием 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 блокируются. Все они должны быть доступны для редактирования и отображать всплывающие подсказки в обычном режиме, как и все остальные, но что-то происходит за кулисами, что я не могу понять.