2015-10-20 6 views
0

У меня вопрос об использовании QtGui.QGraphicsWidget. В данном примере я попытаюсь описать свою проблему. В QtGui.QtGraphicsScene есть два экземпляра QGraphicsWidget, одним из которых является родительский (app_widget.main_widget - синий при запуске), а другой - дочерний его вид (app_widget.subwidget - красный при запуске). Если вы запустите программу, с помощью клавиши «Плюс» на клавиатуре вы можете трансформировать виджеты циркулярно через состояния.PySide QtGui.QGraphicsWidget преобразование дочернего родителя

# --coding: utf-8 -- 
# window.py 

import sys 
from PySide import QtGui, QtCore 

class WidgetBase(QtGui.QGraphicsWidget): 
    def __init__(self, parent = None): 
     super(WidgetBase, self).__init__(parent) 

    def set_background(self, color_hex): 
     palette = QtGui.QPalette() 
     color = QtGui.QColor() 
     color.setRgba(color_hex) 
     palette.setColor(QtGui.QPalette.Background, color) 
     self.setPalette(palette) 
     self.setAutoFillBackground(True) 


class AppWidget(WidgetBase): 
    def __init__(self): 
     super(AppWidget, self).__init__() 
     self.main_widget = WidgetBase(self) 
     self.subwidget = WidgetBase(self.main_widget) 


class Window(QtGui.QMainWindow): 
    change_app_state = QtCore.Signal() 

    def __init__(self, parent=None): 
     QtGui.QMainWindow.__init__(self, parent) 
     SCREEN_DIM = QtGui.QDesktopWidget().screenGeometry() 

     self.app_scene = QtGui.QGraphicsScene(0, 0, SCREEN_DIM.width(), SCREEN_DIM.height()) 

     app_view = QtGui.QGraphicsView(self.app_scene) 
     app_view.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) 
     app_view.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) 

     self.setCentralWidget(app_view) 

     app_widget = AppWidget() 
     app_widget.main_widget.set_background(0x50449558) 
     app_widget.main_widget.resize(500, 500) 
     app_widget.subwidget.set_background(0x50ff3300) 
     app_widget.subwidget.resize(500 * 0.5, 500) 

     self.app_scene.addItem(app_widget) 

     self.machine = QtCore.QStateMachine() 
     state1 = QtCore.QState(self.machine) 
     state2 = QtCore.QState(self.machine) 
     state3 = QtCore.QState(self.machine) 
     state4 = QtCore.QState(self.machine) 

     state1.assignProperty(app_widget.main_widget, 'geometry', QtCore.QRectF(0, 0, 500, 500)) 
     state2.assignProperty(app_widget.main_widget, 'scale', 0.5) 
     state3.assignProperty(app_widget.main_widget, 'scale', 1) 
     state4.assignProperty(app_widget.main_widget, 'geometry', QtCore.QRectF(0, 0, 1000, 500)) 

     trans1 = state1.addTransition(self.change_app_state, state2) 
     trans2 = state2.addTransition(self.change_app_state, state3) 
     trans3 = state3.addTransition(self.change_app_state, state4) 
     trans4 = state4.addTransition(self.change_app_state, state1) 

     trans1.addAnimation(QtCore.QPropertyAnimation(app_widget.main_widget, 'scale', state1)) 
     trans2.addAnimation(QtCore.QPropertyAnimation(app_widget.main_widget, 'scale', state2)) 
     trans3.addAnimation(QtCore.QPropertyAnimation(app_widget.main_widget, 'geometry', state3)) 
     trans4.addAnimation(QtCore.QPropertyAnimation(app_widget.main_widget, 'geometry', state4)) 

     self.machine.setInitialState(state1) 
     self.machine.start() 

    def keyPressEvent(self, e): 
     if e.key() == QtCore.Qt.Key_Plus: 
      self.change_app_state.emit() 


if __name__ == '__main__': 
    app = QtGui.QApplication(sys.argv) 
    window = Window() 
    window.showFullScreen() 
    sys.exit(app.exec_()) 

При масштабировании родительского виджета (изменение «масштаб» свойство - QtGui.QGraphicsWidget свойство, унаследованное от QtGui.QGraphicsObject), ребенок виджет также масштабируются. Но когда я изменяю геометрию родительского виджета (изменяя свойство «geometry» - свойство QtGui.QGraphicsWidget), геометрия дочернего виджета остается неизменной.

Я запускаю Python 2.7.6, PySide версии 1.2.1 и QtCore версии 4.8.6.

Почему не дочерний виджет всегда следит за преобразованиями родителей? Есть ли способ масштабировать только одну ось родительского виджета и получать все дочерние виджеты детей пропорционально?

ответ

1

Ответил на форум qt.

«Он будет следовать за его родительским виджетами, если вы поместите его в макет, который вы установили в указанном родительском виджетах. В противном случае вам придется обрабатывать расположение и размер дочернего виджета».

Ссылка на кварт форуме сообщение:

https://forum.qt.io/topic/59958/pyside-qtgui-qgraphicswidget-child-parent-transformations