簡體   English   中英

PyQt:插槽執行多次

[英]PyQt: Slot execute many times

我有一個自定義小部件,用於在選項卡小部件中創建許多選項卡。 在這個自定義小部件中,我有一個按鈕來發送消息。 此按鈕連接到如下信號:

signal_mapper = QtCore.QSignalMapper()

self.send_btn.clicked.connect(self.sending_message)

sending_message方法中,我獲取數據並向線程發出信號以發送如下消息:

QtCore.QObject.emit(
    signal_mapper,
    QtCore.SIGNAL("send_message"),
    message)

在發送線程中(槽接收)

QtCore.QObject.connect(
    signal_mapper,
    QtCore.SIGNAL("send_message"),
    self.send_message
)

問題是當我有很多標簽並且當我發送“一個”消息時,我發現它發送了創建的標簽數量 * 消息(例如,如果我有 3 個標簽,它會發送 3 條消息)。

編輯:

所以這是一段代碼:

class Main(QtGui.QMainWindow):

    def __init__(self, user, user_lst, icon, connexion):
        super(Main, self).__init__()
        self.user_name = user
        self.user_lst = user_lst
        self.icon = icon
        self.connexion = connexion
        ...
        self.show()

    def init_ui(self):
        ...
        self.send_btn.clicked.connect(self.sending_message)
        ...


        self.chat_widget=ChatForm(self.user_name,self.user_lst,self.icon,self.connexion)
        self.tab_widget.addTab(self.chat_widget, self.my_actions.send_file_icon, "topic 1")

    def new_tab(self):
        chat_widget = ChatForm(self.user_name, self.user_lst, self.icon, self.connexion)
        self.tab_widget.insertTab(self.i, chat_widget, "topic")

    def sending_message(self):
        txt = str(self.line_edit.text())
        if txt != "":
            QtCore.QObject.emit(
                signal_mapper,
                QtCore.SIGNAL("send_message"),
                txt)

這是發送線程:

class SendingThread(QtCore.QThread):
    def __init__(self, client_sock):
        super(SendingThread, self).__init__()
        self.client_socket = client_sock

    def run(self):
        # waiting user to send a message
        QtCore.QObject.connect(
            signal_mapper,
            QtCore.SIGNAL("send_message"),
            self.send_message, QtCore.Qt.UniqueConnection
        )

    def send_message(self, message):
        print("the message as sent", message)
        self.client_socket.send_msg(message)

因此,您的問題(大概)是您打開了 3 個選項卡,並且您將信號綁定到每個選項卡實例,因此所有未刪除的選項卡將同時發出。 可能會發生這樣的事情:

(我的代碼已經在 PySide 中完成,我將其更正為 PyQt。核心原則仍然存在,盡管信號/槽語法略有不同)。

請注意我如何將clicked()信號連接到Signal.emit插槽,而不是連接到method ,然后我可以設置調用Signal.emit條件。

'''Custom signal example'''

# QtTest is for artificial click events, ignore for implementation
from PySide import QtCore, QtGui, QtTest


class MyTabButton(QtGui.QPushButton):
    '''Custom widget for a tab'''

    signal = QtCore.Signal(str)

    def __init__(self, parent=None):
        super(MyTabButton, self).__init__()

        self.check_visible = True
        self.clicked.connect(self.send_message)

    def send_message(self):
        '''Only send message if object is clicked'''

        if not self.check_visible or self.isVisible():
            self.signal.emit('My message')


def printargs(message):
    '''Slot to print signal message'''

    print(message)



def main():
    '''On exec'''

    tabs = QtGui.QTabWidget()
    for _ in range(3):
        mytab = MyTabButton()
        mytab.signal.connect(printargs)
        tabs.addTab(mytab, 'My Tab {}'.format(_))

    # artificial mouse click at widget 0, the first tab
    # nothing should print
    QtTest.QTest.mouseClick(tabs.widget(0), QtCore.Qt.LeftButton)

    # only one tab should print
    tabs.widget(0).check_visible = False
    QtTest.QTest.mouseClick(tabs.widget(0), QtCore.Qt.LeftButton)


if __name__ == '__main__':
    APP = QtGui.QApplication([])
    main()

如果我運行此代碼,則僅打印一個選項卡,並且僅在第二個事件上打印。 此選項卡小部件可以通過MyTabButton.check_visible或小部件的可見性 (MyTabButton.show()) 進行控制。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM