2017-06-21 5 views
1

私は、ユーザーが単語を強調表示できるテキストボックスに機能を追加しようとしています。右クリックし、強調表示された単語を定義するかどうかを選択することができます。コンテキストメニューをコーディングしましたが、テキストボックスの外側をクリックすると表示されます。とにかく、コピー、ペーストなどを含むデフォルトのコンテキストメニューに機能を追加できますか?コンテキストメニューのコードは次のとおりです。PyQt5を使ってPythonテキストボックスのデフォルトのコンテキストメニューに追加するには?

self.setContextMenuPolicy(Qt.ActionsContextMenu) 
defineAction = QtWidgets.QAction("Define", self) 
defineAction.triggered.connect(lambda: self.define(event)) 
self.addAction(defineAction) 
synonymAction = QtWidgets.QAction("Find Synonyms", self) 
synonymAction.triggered.connect(lambda: self.synonym(event)) 
self.addAction(synonymAction) 

答えて

1

テキスト編集ウィジェットをサブクラス化し、createStandardContextMenu(point)を上書きする必要があります。

オーバーライドされたメソッドでは、標準のコンテキストメニューオブジェクトを取得するために基本呼び出しの実装を呼び出します(QMenuを返します)。カスタムアクションでこのメニューを変更し、メニューを返します。

ユーザーがコンテキストメニューを要求すると、この関数が呼び出されます。

は詳細については

EDITをhttp://doc.qt.io/qt-5/qplaintextedit.html#createStandardContextMenuを参照してください:あなたはこの

class MyTextEdit(QLineEdit): 
    def createStandardContextMenu(self, menu): 
      #as above, reimplement this method 

のようにサブクラス化することができ、あなたのGUIを作るとき、あなたはQLineEditの代わりにそのクラスを使用します。

また、customContextMenuRequestedという信号があることを思い出しました。あなたは、代わりにこの

#assume you have the textbox in a variable called self.my_textbox 
self.my_textbox.setContextMenuPolicy(Qt.CustomContextMenu) 
self.my_textbox.customContextMenuRequested.connect(self.generate_context_menu) 

のようにこれを使用して、のようなGUIを生成するクラスにメソッドを追加します。

def generate_context_menu(self, location): 
    menu = self.my_textbox.createStandardContextMenu() 
    # add extra items to the menu 

    # show the menu 
    menu.popup(self.mapToGlobal(location)) 
+0

は、テキスト編集ウィジェットをサブクラス化とはどういう意味ですか? – bridgjac000

+0

@ bridgjac000私は自分の答えを更新しました –

+0

@three_pineapples私はかなり確実に 'self.my_textbox.customContextMenuRequested.connect(self.generate_context_menu)'とされています。それにもかかわらず、メニューはポップアップしませんでしたが、contextMenuEvent [docsに表示されているように]をオーバーライドしました(http://doc.qt.io/qt-5/qtextedit.html #contextMenuEvent)が機能しました。 –

関連する問題