2017-09-25 81 views
0

我試着讓我的菜單自動生成的使用for循環:使用數據庫和詞典添加PyQt5菜單和觸發器[Python的3]

q3 = connect_menu.addMenu('Q3') 
q3menus = {} 
x = 0 
for element in q3s: 
    key = 'Q'+str(x) 
    q3menus[key] = QAction(element[7], self) 
    q3.addAction(q3menus[key]) 
    q3menus[key].triggered.connect(lambda: self.main_form.consavesv(q3menus[key].text())) 
    x += 1 

q3s等於一個使用fetchall功能,從去年SQL獲取數據查詢

q3s = [(1, 'Q3', '127.0.0.1', 28960, "Server Test Name", '5154', '127.0.0.1:28960', "127.0.0.1:28960 | Server Test Name"), (2, 'Q3', '192.168.1.66', 28960, 'Server Test 2', '5154', '192.168.1.66:28960', '192.168.1.66:28960 | Server Test 2')]

我試圖用dictianory,這dictianory新增了菜單的標籤,以及它應該,但是當我點擊他們,我,他們都具有相同的triggered.connect()作爲最後一個呢..

我在做什麼錯? 我不想在這裏創建信號,導致數據庫結果不是靜態的..

對不起,對英文不好。

+0

我想我應該加上'triggered.connect()'外循環,但我不知道那我應該怎麼設置'triggered.connect()'在dictianory – DarkSuniuM

+0

所有的項目,你可以顯示你在運行'print(q3s)'時獲得的結果 – eyllanesc

+0

@eyllanesc問題已更新並且q3s內容已添加 – DarkSuniuM

回答

1

,他的問題是你傳遞的參數lambda函數的方式,正確的語法是:

f = lambda p_1, p_2, ..., p_n: some operation with p_1, p_2, ..., p_n 

在你的情況,你還必須考慮到的QAction觸發信號返回一個叫做檢查值,所以你必須先於參數如下圖所示:

q3menus[key].triggered.connect(lambda checked, key=key: self.main_form.consavesv(q3menus[key].text())) 

除了這種方法,你還可以使用sender()方法返回發出信號的對象,並直接將文本顯示在日Ë下面的例子:

class Example(QMainWindow): 
    def __init__(self, parent = None): 
     QMainWindow.__init__(self, parent) 

     q3s = [(1, 'Q3', '127.0.0.1', 28960, "Server Test Name", '5154', '127.0.0.1:28960', "127.0.0.1:28960 | Server Test Name"), 
     (2, 'Q3', '192.168.1.66', 28960, 'Server Test 2', '5154', '192.168.1.66:28960', '192.168.1.66:28960 | Server Test 2')] 
     menubar = self.menuBar() 

     q3 = menubar.addMenu("Q") 
     q3menus = {} 
     for x, element in enumerate(q3s): 
      key = 'Q'+str(x) 
      q3menus[key] = QAction(element[7], self) 
      q3.addAction(q3menus[key]) 
      q3menus[key].triggered.connect(lambda checked, key=key : self.someFunction(q3menus[key].text())) 
      q3menus[key].triggered.connect(self.anotherFuntions) 

    def someFunction(self, text): 
     print("someFunction {}".format(text)) 

    def anotherFuntions(self): 
     print("anotherFuntions {}".format(self.sender().text())) 

if __name__ == '__main__': 
    app = QApplication(sys.argv) 
    w = Example() 
    w.show()  
    sys.exit(app.exec_()) 
+0

它工作正常!你可以解釋'q3menus [key] .triggered.connect(lambda checked,key = key:self.someFunction(q3menus [key] .text()))嗎? – DarkSuniuM

+1

觸發信號返回一個參數,指示它是否已被檢查,因爲QAction可以檢查,但默認情況下不是,但我們必須考慮它,然後我們必須通過分配其他參數來澄清上面相當於:'q3menus [key] .triggered.connect(lambda checked,param = key:self.someFunction(q3menus [param] .text()))'' – eyllanesc