2015-11-10 7 views
2

Я пытаюсь создать окно инструментов для Maya, в котором я могу щелкнуть правой кнопкой мыши в любом месте, и если я нажму «добавить», появится виджет прямоугольника в моей позиции курсора.Как интерактивно добавлять виджеты с использованием QAction в Pyside/Pyqt без использования управления макетами?

Теперь работает функция правой кнопкой мыши. Я также могу получить позицию курсора в функции addPicker(). Но у меня возникла проблема с размещением вновь созданных виджетов. Если я добавлю макет и добавлю к нему вновь созданные виджеты, они на самом деле появятся. Однако, если я не создал макет для этих виджетов, независимо от того, какую позицию я тестировал, в моем окне ничего не отображается.

Надеюсь, у кого-то есть некоторые идеи. Спасибо всем заранее. Скриншот

щелчку правой кнопкой мыши: A right-click screenshot

class RightClickMenu(QtGui.QMenu): 

    def __init__(self, *args, **kwargs): 
     super(RightClickMenu, self).__init__(*args) 

     self.parentWidget().setContextMenuPolicy(QtCore.Qt.CustomContextMenu) 
     self.parentWidget().customContextMenuRequested.connect(self.menuPos) 

    def menuPos(self, *args): 
     self.exec_(QtGui.QCursor.pos()) 

class Ui_window(object): 
    def setupUi(self, window): 
     window.setObjectName("window") 
     window.resize(555, 900) 
     self.widget_base = QtGui.QWidget() 

     self.verticalLayout_window = QtGui.QVBoxLayout(window) 
     self.verticalLayout_window.addWidget(self.widget_base) 

     self.menu_popup = RightClickMenu(self.widget_base) 
     self.menu_popup.setObjectName("popupMenu") 
     self.verticalLayout_widget = QtGui.QVBoxLayout(self.widget_base) 

     # Action - add picker 
     addAction = QtGui.QAction('Add Picker', self.widget_base) 
     addAction.setShortcut('Ctrl+A') 
     addAction.setStatusTip('Add Picker') 
     addAction.triggered.connect(self.addPicker) 
     self.menu_popup.addAction(addAction) 

     # Action - delete picker 
     deleteAction = QtGui.QAction('Delete Picker', self.widget_base) 
     deleteAction.setShortcut('Ctrl+D') 
     deleteAction.setStatusTip('Delete Picker') 
     deleteAction.triggered.connect(self.deletePicker) 
     self.menu_popup.addAction(deleteAction) 

    def addPicker(self): 
     cursorPos = QtGui.QCursor.pos() 
     localPos = self.widget_base.mapFromGlobal(cursorPos) 
###################################################################### 
     # how??? below doesn't work. 
     self.pushButton = QtGui.QPushButton(self.widget_base) 
     self.pushButton.setGeometry(QtCore.QRect(220, 50, 75, 23)) 
     self.pushButton.setObjectName("pushButton") 

    def deletePicker(self): 
     print 'delete' 



def run(): 
    import sys 
    try: 
     Ui_window.close() 
    except: 
     pass 

    pickerWindow = QtGui.QDialog() 
    ui = Ui_window() 
    ui.setupUi(pickerWindow) 
    pickerWindow.show() 
    pickerWindow.exec_() 

ответ

1

Удивительное решение (см this вопрос):

self.pushButton.show() 
+0

Большое спасибо! Абсолютно работает !! :) – user3042801