Qt - Найти 'Actual Widget' под 'viewport' в Coordinates - PullRequest
2 голосов
/ 27 января 2012

Моя программа Qt использует систему извлечения виджетов objectNames при щелчке мышью путем нахождения координат mousePressEvents и последующего нахождения дочернего виджета (или окна) по этим координатам.

Это прекрасно работает для большинства виджетов, но не для следующих виджетов:
QScrollBox, QTableWidget, QGraphicsView, QTextEdit, QSpinBox.

Эти виджеты (кроме QSpinBox) возвращают 'qt_scrollarea_viewport' вместо их objectName, предположительно потому, что это дочерний виджет из перечисленных выше.

Например:
У вас есть QTextEdit с геометрией (0,0,50,50).
Очевидно, что координаты (10,10) находятся на этом виджете.
Пока чтоВызов parent.childAt( (10,10) ) не возвращает QTextEdit.
Вызов .objectName() показывает, что это вместо этого 'qt_scrollarea_viewport'.

Если бы у вас было двадцать разных QTextEdits с двадцатью разными именами объектов, они бы все ещеreturn 'qt_scrollarea_viewport'.

Итак, как мне получить фактическое objectName QTextEdit, а не его графический дочерний виджет (который я интерпретирую как 'viewport'), учитывая, что у меня есть координатывиджет?

Спасибо!


PyQt4
Python 2.7.2
Windows 7

Ответы [ 2 ]

1 голос
/ 27 января 2012

Это дочерний виджет.

Решение:

if widget.objectName() == 'qt_scrollarea_viewport':    
    actual_obj = widget.parent().objectName()
0 голосов
/ 29 января 2012

Может быть несколько уровней виджетов, и в этом случае childAt вернет самый внутренний виджет.

Итак, чтобы получить виджет первого уровня, вы можете зацикливаться, пока parent не станет фактическим родителем:

widget = parent.childAt(x,y)
while parent != widget.parent():
    widget = widget.parent()
actual_obj = widget.objectName()
...