Я создаю собственное приложение 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?
Я создаю собственное приложение PySide6 с QGraphicsView, содержащим различные пользовательские элементы, включая QLineEdit внутри QGraphicsProxyWidget, который является частью QGraphicsItemGroup. Однако я не могу ввести QLineEdit, и, похоже, он не получает фокус при нажатии. Вот минимальный пример кода, иллюстрирующий проблему: [code]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)
text = QGraphicsTextItem("Test Item", self) text.setDefaultTextColor(Qt.GlobalColor.darkMagenta) text.setPos(10, -30) # Position above the other components self.addToGroup(text)
[/code] В коде также были функции панорамирования, масштабирования и привязки к сетке, которые я удалил, чтобы свести их к минимуму. Я думаю, что этот код также можно запускать с помощью PyQt6 или PyQt5. Я пытаюсь настроить QLineEdit так, чтобы он получал фокус и позволял вводить текст при нажатии. Вся группа должна оставаться подвижной. [b]Проблема[/b]: [list] [*]QLineEdit этого не делает. получить фокус или разрешить ввод. [/list] Я пробовал устанавливать политики фокуса как для QLineEdit, так и для QGraphicsProxyWidget, а также установил флаг ItemIsFocusable для QGraphicsProxyWidget. Однако нажатие QLineEdit не позволяет вводить текст или переключать фокус, хотя я вижу изменение курсора при наведении QLineEdit. [b]Вопросы[/b]:[list] [*]Как я могу гарантировать, что QLineEdit внутри QGraphicsProxyWidget получит фокус? [*]Нужны ли дополнительные шаги, чтобы разрешить ввод текста в QLineEdit внутри QGraphicsItemGroup? [/list]