2017-11-20 19 views
2

저는 PyQT를 사용하여 작은 응용 프로그램을 작성하고 있습니다. 나는 일반적인 옵션 ("파일", "편집", "옵션"등)을 포함하는 응용 프로그램의 맨 위에 메뉴 막대를 만들려고하지만 내 QMainWindow 클래스에 추가하려고하면 내 도구 모음이 나타나지 않습니다. 나는 주변을 둘러 보았지만 내가 뭘 잘못하고 있는지 분명하지 않습니다. QToolbar을 만드는 대신 QMainWindow.menuBar() 메서드를 사용하여 시도했지만, 그렇다고해도 표시 줄은 전혀 보이지 않습니다. 아래의 코드를 사용하여 비어있는 경우에도 적어도 빈 바를 얻습니다. 아래 코드는이 문제의 최소한의 예입니다. 나는 행동이 나타나기 위해 내가 무엇을 바꾸어야하는지 알고 싶다.QMainWindow에서 메뉴 막대를 만드는 방법

import sys 
from PyQt5.QtCore import Qt 
from PyQt5.QtGui import QBrush 
from PyQt5.QtWidgets import QMainWindow, QGraphicsScene, QToolBar, QMenu, QAction, QGraphicsView, QApplication 


class GraphWindow(QMainWindow): 
    def __init__(self): 
     super().__init__() 
     self.scene = QGraphicsScene() 

     # a grid foreground 
     self.scene.setBackgroundBrush(QBrush(Qt.lightGray, Qt.CrossPattern)) 
     self.grid = True 

     # Create upper toolbar with menu options 
     tb = QToolBar() 
     menu = QMenu() 
     db_action = QAction("Open file") 
     db_action.setStatusTip("Select a file to use as a database") 
     db_action.triggered.connect(self.open_new_db) 
     menu.addAction(db_action) 

     tb.addWidget(menu) 
     tb.setAllowedAreas(Qt.TopToolBarArea) 
     tb.setFloatable(False) 
     tb.setMovable(False) 
     self.addToolBar(tb) 

     self.statusBar().showMessage("Ready") 

     # Demonstrate the results from the input. 

     graphics = QGraphicsView(self.scene) 
     self.setCentralWidget(graphics) 
     self.showFullScreen() 

    def open_new_db(self): 
     pass 

    def keyPressEvent(self, e): 
     # Currently, we respond to a press of the Escape key by closing the program. 
     if e.key() == Qt.Key_Escape: 
      self.close() 

app = QApplication(sys.argv) 
gr = GraphWindow() 
sys.exit(app.exec_()) 
+0

어떤 OS 버전과 QT 버전을 사용하고 있습니까? 이 [수] (https://github.com/robotology/yarp/issues/521) [버그] (https://bugs.launchpad.net/ubuntu/+source/appmenu-qt5/+bug/1307619)) –

+0

나는 초등 OS를 사용한다 0.4.1 Loki와 PyQT 5.9 – Thalamus

답변

1

메뉴 모음에 메뉴를 만들려면 제목을 지정해야합니다. 또한 Qt는 메뉴 나 액션의 소유권을 갖지 않으므로 가비지 수집을하지 않도록 다른 방법으로 부모에게 제공하거나 참조를 유지해야합니다. 예를 들면 다음과 같이 수정할 수 있습니다.

class GraphWindow(QMainWindow): 
    def __init__(self): 
     ... 
     # Create menu options 
     menubar = self.menuBar() 
     menu = QMenu('File', self) # title and parent 
     db_action = QAction("Open file", self) # title and parent 
     db_action.setStatusTip("Select a file to use as a database") 
     db_action.triggered.connect(self.open_new_db) 
     menu.addAction(db_action) 
     menubar.addMenu(menu) 

     self.statusBar().showMessage("Ready") 

툴바가 필요하지 않습니다. 같은 일을 달성하기 위해 다소 짧고 간단한 방법은, 다음과 같이,보다 직접적으로 메뉴와 작업을 추가하는 것입니다 : 여기

menubar = self.menuBar() 
    menu = menubar.addMenu('File') 
    db_action = menu.addAction("Open file") 
    db_action.setStatusTip("Select a file to use as a database") 
    db_action.triggered.connect(self.open_new_db) 

, 필요한 곳 ​​Qt는 자동으로 부모를 설정합니다.

+0

고마워,이게 내가 필요한거야. – Thalamus

1

문제가 가비지 컬렉터에 의해 발생은 변수는 생성 된 컨텍스트에 남아, 당신은 생성자에서 그것을 만든 이후, 그 파이썬 방법의 끝을 제거합니다. 이 솔루션에서는 부모가있는 요소 또는 클래스의 구성원 인 요소 만 첫 번째 옵션을 사용합니다.

class GraphWindow(QMainWindow): 
    def __init__(self): 
     [...] 
     # Create upper toolbar with menu options 
     tb = QToolBar(self) 
     menu = QMenu(self) 
     db_action = QAction("Open file", self) 
     db_action.setStatusTip("Select a file to use as a database") 
     db_action.triggered.connect(self.open_new_db) 
     menu.addAction(db_action) 
     tb.addWidget(menu) 
     tb.setAllowedAreas(Qt.TopToolBarArea) 
     tb.setFloatable(False) 
     tb.setMovable(False) 
     self.addToolBar(tb) 

     self.statusBar().showMessage("Ready") 
     [...]