QLineEdit внутри QGraphicsItemGroup не получает фокусPython

Программы на Python
Ответить
Anonymous
 QLineEdit внутри QGraphicsItemGroup не получает фокус

Сообщение Anonymous »

Я создаю собственное приложение PySide6 с QGraphicsView, содержащим различные пользовательские элементы, включая QLineEdit внутри QGraphicsProxyWidget, который является частью QGraphicsItemGroup. Однако я не могу ввести QLineEdit, и, похоже, он не получает фокус при нажатии.
Вот минимальный пример кода, иллюстрирующий проблему:

Код: Выделить всё

import sys
from PySide6.QtCore import Qt, QPointF
from PySide6.QtGui import QBrush, QPen, QPainter, QColor
from PySide6.QtWidgets import (
QApplication, QGraphicsItem, QGraphicsRectItem,
QGraphicsScene, QGraphicsView, QVBoxLayout, QWidget, QGraphicsTextItem, QGraphicsLineItem, QGraphicsItemGroup,
QLineEdit, QGraphicsProxyWidget
)

class CompositeItem(QGraphicsItemGroup):
def __init__(self, x=0, y=0):
super().__init__()

self.setPos(x, y)

rect = QGraphicsRectItem(0, 0, 100, 50, self)
rect.setBrush(QBrush(QColor(255, 0, 0, 100)))  # Semi-transparent red
rect.setPen(QPen(Qt.GlobalColor.black, 2))
self.addToGroup(rect)

line = QGraphicsLineItem(0, 0, 100, 100, self)
line.setPen(QPen(Qt.GlobalColor.green, 2, Qt.PenStyle.DashLine))
self.addToGroup(line)

text = QGraphicsTextItem("Test Item", self)
text.setDefaultTextColor(Qt.GlobalColor.darkMagenta)
text.setPos(10, -30)  # Position above the other components
self.addToGroup(text)

self.line_edit = QLineEdit("Edit me")
self.line_edit.setFixedWidth(100)
self.line_edit.setFocusPolicy(Qt.FocusPolicy.ClickFocus)

self.line_edit_proxy = QGraphicsProxyWidget(self)
self.line_edit_proxy.setWidget(self.line_edit)
self.line_edit_proxy.setPos(0, 55)
self.line_edit_proxy.setFocusPolicy(Qt.FocusPolicy.ClickFocus)
self.line_edit_proxy.setFlag(QGraphicsItem.GraphicsItemFlag.ItemIsFocusable)
self.addToGroup(self.line_edit_proxy)

self.setFlag(QGraphicsItem.GraphicsItemFlag.ItemIsMovable)
self.setFlag(QGraphicsItem.GraphicsItemFlag.ItemIsSelectable)

def mousePressEvent(self, event):
self.line_edit_proxy.setFocus()  # Set focus when the item is clicked
super().mousePressEvent(event)

class CustomCanvas(QGraphicsView):
def __init__(self):
super().__init__()

self.scene = QGraphicsScene(0, 0, 600, 400)
self.setScene(self.scene)
self.setRenderHint(QPainter.RenderHint.Antialiasing)

self.setFocusPolicy(Qt.FocusPolicy.StrongFocus)
self.setInteractive(True)

self.add_items()

def add_items(self):
comp = CompositeItem(100, 100)
self.scene.addItem(comp)

app = QApplication(sys.argv)
window = QWidget()
layout = QVBoxLayout(window)
canvas = CustomCanvas()
layout.addWidget(canvas)
window.setLayout(layout)
window.show()
sys.exit(app.exec())

В коде также были функции панорамирования, масштабирования и привязки к сетке, которые я удалил, чтобы свести их к минимуму. Я думаю, что этот код также можно запускать с помощью PyQt6 или PyQt5.
Я пытаюсь настроить QLineEdit так, чтобы он получал фокус и позволял вводить текст при нажатии. Вся группа должна оставаться подвижной.
Проблема:
  • QLineEdit этого не делает. получить фокус или разрешить ввод.
Я пробовал устанавливать политики фокуса как для QLineEdit, так и для QGraphicsProxyWidget, а также установил флаг ItemIsFocusable для QGraphicsProxyWidget. Однако нажатие QLineEdit не позволяет вводить текст или переключать фокус, хотя я вижу изменение курсора при наведении QLineEdit.
Вопросы:
  • Как я могу гарантировать, что QLineEdit внутри QGraphicsProxyWidget получит фокус?
  • Нужны ли дополнительные шаги, чтобы разрешить ввод текста в QLineEdit внутри QGraphicsItemGroup?


Подробнее здесь: https://stackoverflow.com/questions/791 ... eive-focus
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»