2015-08-09 73 views
0

我正在使用pyside和sqlalchemy獲取聯繫信息數據庫。單鍵點擊觸發信號多次而不是一次

sqlalchemy的設置非常標準,除了當我使用sessionmaker()創建會話時,我設置了expire_on_commit = False

爲了能夠在一段時間內創建一個新的會話,我正在使用一種刷新按鈕。問題是我每次使用刷新按鈕時,當我嘗試添加一個新的行/條目時,我會得到2或4個附加條目(只需點擊一次),而如果刪除,所有「副本」也會被刪除他們不是真正的副本,但因爲他們每個人都有自己的唯一ID)。

def refresh(self): 

    self.session.close_all() 
    self.session = CreateSession(self.username, self.password) #custom method defined elsewhere for creating a session 

    self.TableViews() #initializing the table views for pyside 

    self.WidgetsToAttributes() #connect widgets of the gui to the sqlalchemy scheme attributes 

    self.connectSignals() #connects the qt signals to the appropriate functions in code 

    pass 

(也有一些額外的初始化,但他們是這裏無關緊要,因爲他們只初始化一些小部件)

上述所有功能都用在別的地方,例如用於GUI的第一初始化,所以這裏不起作用的是這些方法的組合。從我收集的信息來看,這是導致所有麻煩的connectSignals()方法。信號明顯增加了一倍(有時翻兩番),從而導致一次點擊就產生多個條目(執行代碼)。

是什麼原因導致的,我該如何避免它?

回答

0

如果您多次撥打connect,您的信號將連接數次到相同的插槽。然後一個信號將觸發對該插槽的多次呼叫。我認爲這就是爲什麼你的數據庫中有多個條目。

作爲一個簡單的例子中,代碼會波紋管打印兩個「1」,每次按鈕被點擊:當對象被銷燬

self.button=QtGui.QPushButton("my button") 
self.button.clicked.connect(self.on_click) 
self.button.clicked.connect(self.on_click) 
def on_click(self): 
    print("1") 

信號是自動斷開。在你的情況下,你銷燬self.session來創建一個新的。所以直接鏈接到self.session的每個信號都應該被銷燬。

但是,如果你有這樣的事情:

class myWidget(QtGui.QWidget): 
    def __init__(self, parent=None): 
     super(myWidget, self).__init__(parent) 
     self.button=QtGui.QPushButton("add entry") 
     self.button.clicked.connect(self.on_click) 

    def on_click(self): 
     self.session.add_an_entry() 

然後摧毀self.session不會斷開按鈕和on_click功能之間的信號。
因此,您可以多次撥打此類connect,也可以手動刪除與disconnect的連接。