2011-11-16 41 views
1

我有了這樣的結構的菜單:PyQt的子菜單原路返回

Elements 
    A 
    B 
    C\ 
     1\ 
      a 
      b 
     2\ 
      a 
      b 
    D 

其中的元素顯示在一個\菜單欄的東西有一個子菜單。

在這個例子中,我有兩個a's。我希望能夠區分哪個a被點擊購買獲得這樣的列表,例如['a','1','C','元素']。

Qt有一個函數可以查找頂層菜單或回溯方法嗎?

我不想爲菜單中的每個QAction編寫一個連接,因爲這將會產生大量額外的代碼,而且我認爲這很冗餘。

回答

1

利用QMenu.triggered,QMenuBar.triggeredQToolBar.actionTriggered信號。

這些信號都通過了對觸發操作的引用,從而避免了將每個操作連接到單個插槽的需要。

另一種方法是創建一個QAction的子類,允許將處理程序作爲參數傳遞給其構造函數。所有的鍋爐板連接代碼可以分解爲__init__方法。如果在多個不同的菜單和工具欄中重複使用了很多操作,則此方法可能更加靈活。

0

QSignalMapper可能是你正在尋找的。

+0

信號映射器用於重新發射帶有自定義標識符的信號,以便所有信號都可以通過一個插槽來處理。這意味着信號映射器需要連接到每個單獨動作的「觸發」信號,這似乎並不是提問者想要的。 – ekhumoro

0

我在下面找到了解決這個問題的另一種方法,但是我會和ekhumoro的答案一起去,因爲他的想法更清晰。

backtrack = [str(event.text())] 
previousWidget = event.associatedWidgets()[0] 
while previousWidget.__class__.__name__ != 'QMenuBar': 
    backtrack.append(str(previousWidget.title())) 
    previousWidget = previousWidget.parent() 
print backtrack