2017-11-20 13 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

問題は、ガベージコレクタによって引き起こされ、変数にのみ作成されたコンテキストに残り、そしてあなたは、コンストラクタでそれを作成しておりますので、そのPythonのメソッドの終わりには、それを排除します。このソリューションでは、親を持つ要素またはクラスのメンバである要素のみが最初のオプションを使用します。

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") 
     [...] 
関連する問題