2011-12-30 10 views
0

QTextEditでコンテキストメニューを調整しようとしています。QTextEditで場所依存のコンテキストメニューをカスタマイズする

class LinkTextBrowser(QTextBrowser): 
    def contextMenuEvent(self, event): 
     menu = self.createStandardContextMenu(event.pos()) 
     # do stuff to menu here 
     menu.popup(event.globalPos()) 

ただし、これは場所を特定するためのクリックでは機能しません。次のコードを使用して、デフォルトのメニューにアクセスして表示することに成功しました。問題のケースは、QTextBrowserの右クリックメニューの「リンク先のコピー」項目です。これは、明示的な理由から、リンクを右クリックした場合にのみ有効になります。私はこれを有効にすることはできません。私はCreateStandardContextMenuに間違った位置を渡していると思われますが、私はそれをフィードする正しい位置を特定できません。

私は)(event.globalPos()とevent.posの両方を試してみましたが、どちらも仕事の。私はQTextEditのソースコードも調べましたが、どこにも行きませんでした。どのポジションを期待していますか?

編集:更新:それは問題がTextBrowserでスクロールで表示されます。ウィンドウの一番上までスクロールしてevent.pos()を使用すると、動作します。私はまだ作業コードを持っていませんが、スクロールの修正は解決策です。

(具体的には、「リンク先のコピー」アクションによって生成された信号を切断し、それを自分の関数に接続して、クリップボードにコピーする前にURLを調整してから、コピー、およびIは、再書き込み作業ビットへの特段の欲求を持っていません。)

答えて

0

ここでの作業は、座標の変換である:

QMenu *menu = new QMenu(); 
menu->addAction(...); 
menu->exec(textEdit->mapToGlobal(pos)); 

それはCです++が、私はあなたが簡単にのpythonに変換できることを確信している:

class LinkTextBrowser(QTextBrowser): 
    def contextMenuEvent(self, event): 
     self.link_pos = event.pos() 
     # correct for scrolling 
     self.link_pos.setX(self.link_pos.x() + self.horizontalScrollBar().value()) 
     self.link_pos.setY(self.link_pos.y() + self.verticalScrollBar().value()) 
     menu = self.createStandardContextMenu(self.link_pos) 

     # do stuff to menu 

     menu.popup(event.globalPos()) 
0

self.mapToGlobal(event.pos())を試してみて、それがアカウントのスクロール位置を考慮する必要があります。

+0

それはQTextEditの内容上の位置、残念ながら、ない地球上の位置を必要とします。 – Sam

0

はたぶん、あなたのような何かを試すことができます。

関連する問題