2017-02-24 16 views
0

QPushButton을 컨텍스트 메뉴로 생성하고 디렉토리 내의 이미지에서 발견 된 텍스트를 기반으로 다른 값으로 하위 메뉴를 채우는 루프가 있습니다.) 중요한PySide QPushButton 버튼마다 할당하지 않은 마우스 오른쪽 버튼 클릭 컨텍스트 메뉴

for self.preview in previewFiles: 

self.image = self.dir_path+"/"+self.preview 
self.btn = QPushButton() 
self.btn.setContextMenuPolicy(Qt.CustomContextMenu) 
self.btn.customContextMenuRequested.connect(self.on_context_menu) 
self.btn.setMinimumSize(360, 360) 
self.btn.setMaximumSize(360, 360) 
self.btn.setStyleSheet("background-image: url(" + self.image + ");border:1px solid #333;text-align: bottom center;font: bold 12px;") 
#popup menu 
self.popMenu = QMenu(self) 

# Resolution Drop down 
res = QMenu("Resolution") 
for reso in albedoRes: # Add resolutions to sub menu based on image res found 
    if "256" in reso: 
     res.addAction(QAction('256', self, checkable=True)) 
    if "512" in reso: 
     res.addAction(QAction('512', self, checkable=True)) 
    if "1K" in reso: 
     res.addAction(QAction('1024', self, checkable=True)) 
    if "2K" in reso: 
     res.addAction(QAction('2048', self, checkable=True)) 
    if "4K" in reso: 
     res.addAction(QAction('4096', self, checkable=True)) 
    if "8K" in reso: 
     res.addAction(QAction('8192', self, checkable=True)) 
self.popMenu.addMenu(res) 
self.popMenu.addSeparator().setText("Alternate Shaders") 
self.popMenu.addAction(QAction('Blinn', self)) 
self.popMenu.addAction(QAction('Phong', self)) 
self.popMenu.addSeparator() 
self.popMenu.addAction(QAction('Open file(s) location', self)) 
#self.btn.setMenu(self.popMenu) 
self.a_widget.setLayout(self.a_layout) 
self.a_layout.addWidget(self.btn) # add rows to main layout 

은 파일 이름에 특정 문자열을 발견하면이 메뉴에 액션을 추가해야 볼 수 있듯이 - 대신, 그것은 그러나이 당 버튼 저장되지

을한다 다음 이미지 파일 이름을 기반으로 QAction을 대체하는 것입니다. (실제로 보이는 최종 QAction은 루프의 마지막 이미지와 같습니다.)

setMenu()를 사용하면 모든 것이 올바르게 지정되지만 상황에 맞는 메뉴 내에서 대신 사용하고 싶습니다.

내가 쉽게 알 수없는 것이 있지만 꽤 잘 모르겠다. 어떤 지침도 인정 될 것이다. 감사.

답변

0

대신 다른 함수에서 버튼으로 메뉴를 만들 :

트릭을 수행
import PyQt4.QtCore as QtCore 
import PyQt4.QtGui as QtGui 

class test(QtGui.QDialog): 

    def __init__(self): 

     super(test, self).__init__() 
     self.setObjectName("test") 
     self.resize(574, 203) 
     self.setWindowTitle("Clone UI") 

     self.a_layout = QtGui.QHBoxLayout() 

     previewFiles = ['blood-lips-lipstick-makeup-red-lips-Favim.com-75480.jpg', 'mins.jpg'] 

     # ABOVE CODE WAS PLACEHOLDER 

     for preview in previewFiles: 

      self.image = '/x/path' + preview 
      self.btn = QtGui.QPushButton() 
      self.btn._name = preview.split('.')[0] # use for my if/else condition menu 


      # create the ocntext 
      self.btn.installEventFilter(self) 
      self.btn.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) 
      self.btn.customContextMenuRequested.connect(self.btnClicked) 

      self.btn.setMinimumSize(360, 360) 
      self.btn.setMaximumSize(360, 360) 
      self.btn.setStyleSheet("background-image: url(" + self.image + ");border:1px solid #333;text-align: bottom center;font: bold 12px;") 

      #popup menu 
      self.popMenu = QtGui.QMenu(self) 

      #self.btn.setMenu(self.popMenu) 
      self.setLayout(self.a_layout) 
      self.a_layout.addWidget(self.btn) # add rows to main layout 

    def btnClicked(self, QPos): 

     # the function that create the popup menu 

     # get the button clicked 
     btn = self.sender() 

     # define where the menu appear on click 
     parentPosition = btn.mapToGlobal(QtCore.QPoint(0, 0)) 
     menuPosition = parentPosition + QPos 

     #clear the menu at each click to customize 
     self.popMenu.clear() 

     #populate 
     self.populateBtnContext(btn._name) 

     #show 
     self.popMenu.move(menuPosition) 
     self.popMenu.show() 

    def populateBtnContext(self, name): 

     # Do some if here : 
     if name == "mins": 
      self.popMenu.addAction(QtGui.QAction('256', self, checkable=True)) 
      self.popMenu.addAction(QtGui.QAction('512', self, checkable=True)) 
      self.popMenu.addAction(QtGui.QAction('1024', self, checkable=True)) 
     else: 
      self.popMenu.addAction(QtGui.QAction('2048', self, checkable=True)) 
      self.popMenu.addAction(QtGui.QAction('4096', self, checkable=True)) 
      self.popMenu.addAction(QtGui.QAction('8192', self, checkable=True)) 

     self.popMenu.addSeparator().setText("Alternate Shaders") 
     self.popMenu.addAction(QtGui.QAction('Blinn', self)) 
     self.popMenu.addAction(QtGui.QAction('Phong', self)) 
     self.popMenu.addSeparator() 
     self.popMenu.addAction(QtGui.QAction('Open file(s) location', self)) 

win = test() 
win.show() 
+0

가, 감사합니다 :) – Voronoi