2016-09-17 9 views
0

За последние несколько дней я пытался решить проблему перемещения виджета. В какой-то момент я попытался переписать классы QComboBox с помощью сигналов мыши, но это не сработало. В ходе работы я решил разместить родительский виджет в QGraphicsWidget, но как только я попытаюсь добавить другой элемент, он больше не отображается, и я не уверен, что делать. Вот полный тестовый скрипт:Вопрос о QGraphicsview + scene + QGroupBox

from PyQt4 import QtGui, QtCore 
from PyQt4.QtGui import QApplication,QGraphicsItem, QGraphicsView, QGraphicsScene, QDesktopWidget, QCheckBox, QGroupBox, QPushButton, QGridLayout, QLabel, QLineEdit, QComboBox, QFont, QRadioButton, QButtonGroup, QWidget, QShortcut, QKeySequence, QIcon, QListView, QStandardItemModel, QStandardItem, QAction, QIntValidator, QListWidget, QProgressBar, QSpacerItem 
from PyQt4.QtCore import QRect 
from functools import partial 
import sys 

class node_GUI(QtGui.QWidget): 
    def __init__(self): 
     super(node_GUI, self).__init__() 



class Main(QtGui.QMainWindow): 
    def __init__(self, *args): 
     super(Main, self).__init__(*args)#QtGui.QMainWindow.__init__(self) 
     self.init_defaults() 
    def init_defaults(self): 
     self.setGeometry(800,800,500,200) 
     self.lay_main = QGridLayout() 
     self.centralwidget = QtGui.QWidget() 
     self.centralwidget.setLayout(self.lay_main) 
     self.setCentralWidget(self.centralwidget) 

     btn_create_node = QPushButton("Create Node View") 
     btn_create_node.clicked.connect(self.create_node_view) 
     self.lay_main.addWidget(btn_create_node) 

    def showWindow(self,window): 
     window.show() 

    def printTest(self): 
     print "Start" 
     box = QGroupBox("subWidget") 
     box_btn = QPushButton("Test") 
     box_btn.clicked.connect(self.printTest) 
     le_edit = QLineEdit() 
     lay = QGridLayout() 
     box.setLayout(lay) 
     lay.addWidget(box_btn) 
     lay.addWidget(le_edit) 

     area = QtGui.QGraphicsWidget() 
     area.setMinimumSize(QtCore.QSizeF(400,300)) 
     area.setFlag(QtGui.QGraphicsItem.ItemIsMovable, True) 
     area.setFlag(QtGui.QGraphicsItem.ItemIsSelectable, True) 

     proxy = self.scene.addWidget(box) 
     proxy.setParentItem(area) 

     print "END" 
    def create_node_view(self): 
     print "creting node view" 
     window = node_GUI() 
     window.setGeometry(QRect(100, 100, 400, 200)) 
     window.setWindowTitle("node ") 
     window.setObjectName("node") 
     show_window = QPushButton("Show Node Editor") 
     show_window.setObjectName("btn") 
     show_window.clicked.connect(partial(self.showWindow,window)) 
     self.lay_main.addWidget(show_window) 

     box = QGroupBox("Widgets") 
     box_btn = QPushButton("Test") 
     box_btn.clicked.connect(self.printTest) 
     le_edit = QLineEdit() 
     lay = QGridLayout() 
     box.setLayout(lay) 
     lay.addWidget(box_btn) 
     lay.addWidget(le_edit) 

     area = QtGui.QGraphicsWidget() 
     area.setMinimumSize(QtCore.QSizeF(300,300)) 
     area.setFlag(QtGui.QGraphicsItem.ItemIsMovable, True) 
     area.setFlag(QtGui.QGraphicsItem.ItemIsSelectable, True) 
     area.setAutoFillBackground(True) 

     ecs = QtGui.QGraphicsEllipseItem() 
     ecs.setRect(QtCore.QRectF(79,79,79,79)) 
     ecs.setFlag(QtGui.QGraphicsItem.ItemIsMovable, True) 
     ecs.setFlag(QtGui.QGraphicsItem.ItemIsSelectable, True) 

     view = QGraphicsView() 
     self.scene = QGraphicsScene() 
     self.scene.addItem(area) 
     proxy = self.scene.addWidget(box) 
     proxy.setParentItem(area) 

     self.scene.addItem(ecs) 
     view.setScene(self.scene) 

     lay_window = QGridLayout() 
     window.setLayout(lay_window) 
     lay_window.addWidget(view) 


def main(): 
    app = QtGui.QApplication(sys.argv) 
    main = Main() 
    main.show() 
    sys.exit(app.exec_()) 


if __name__ == "__main__": 
    main() 

При нажатии на Create Node View> Show кнопку Node Editor> Test> новый GroupBox должен появиться, но это не работает. Не знаю, почему.

ответ

0

Правильно, поэтому я прекратил использовать QGraphicsWidget(), и вместо этого я просто использую QGraphicsRectItem (например, ecs), как только я это сделал, все началось, как и следовало ожидать.

+0

Немного о редактировании. Перетаскивание виджета не работает, если я перетаскиваю groupBox, но только с помощью GraphicsItem, знает ли any1, как передать событие перетаскивания из groupBox в родительский, чтобы просмотреть его? – Dariusz