2011-12-30 112 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的右鍵菜單中的「複製鏈接位置」項,該菜單僅在右鍵單擊鏈接時才啓用,原因很明顯。我無法將它啓用。我懷疑我通過錯誤的位置來創建標準上下文菜單,但我無法弄清楚它的正確位置。

我已經嘗試event.globalPos()和event.pos(),都沒有工作。我也看了QTextEdit的源代碼,但沒有得到任何地方。它期望什麼位置?

編輯:更新:看來問題是在TextBrowser中滾動;如果我滾動到窗口的頂部並使用event.pos()它的行爲。我還沒有工作代碼,但糾正滾動是解決方案。 (具體來說,我想斷開復制鏈接位置操作發出的信號並將其連接到我自己的函數,這樣我就可以在將URL複製到剪貼板之前調整它的URL,從而使我可以在創建鏈接之前絕對地等等複製,並且我沒有特別的願望來重新編寫工作位)。

回答

0

這裏的工作變換座標:

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 2011-12-30 13:51:16

0

也許你可以嘗試這樣的:

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

這是C++,但我敢肯定,你可以很容易將其轉換爲蟒蛇。