2016-04-23 8 views
1

私は、タブウィジェットで多くのタブを作成するために使用するカスタムウィジェットを持っています。このカスタムウィジェットでは、メッセージを送信するボタンがあります。このボタンは、このような信号に接続されている:送信スレッドでPyQt:スロットが何度も実行される

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

:私は、データをフェッチし、私はこのようなメッセージを送信するスレッドに信号を発するsending_message方法で

signal_mapper = QtCore.QSignalMapper() 

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

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

問題は、私は多くのタブを持っていると私は「1」のメッセージを送信するときに、私はそれが、タブの数が(*メッセージを作成し送信することを見つけたときである(スロットは受信)例えば、私は3つのタブにそれを持っている場合3つのメッセージを送信する)。

EDIT:

だから、これはコードの断片である:ここ

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) 
+0

QTabWidgetのすべてのタブでこの信号を初期化して、共通のスロットに接続していますか? 共通のスロット( 'self.parent()。do_something()')に接続するのではなく、スロットとしてインスタンスメソッドに接続すると、 'if self。 isVisible():self.parent()。do_something() ' この方法では、現在表示されているタブからのみ表示されます。 –

+0

私はpyqtの初心者です。pleaeは具体的な例を教えていただけますか –

+0

ごくわずかな質問)。 'send_btn'は' MainWindow'で定義されていて、個々のタブでは定義されていませんか?それは不思議です、私はそれがどのように振る舞うかわからない、それは、それぞれ、新しいタブに改宗するべきです。 –

答えて

1

を、あなたは(おそらく)問題ですさ3つのタブが開いていて、各タブインスタンスに信号がバインドされているので、削除されていないタブも同時に表示されます。

(私のコードはPySideで修正されていますが、私はPyQtに修正します。シグナルとスロットの構文は若干異なりますが、コアの原則はそのままです)。

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() 

このコードを実行すると、1つのタブのみが印刷され、2番目のイベントでのみ印刷されます。このタブウィジェットは、MyTabButton.check_visibleまたはウィジェットの可視性(MyTabButton.show())のいずれかで制御できます。

+0

まだ明らかにされていません、私にもっと助けてください。コードフラグメントを追加して質問を編集します。あなたが私を助けてくれることを願っています。ありがとう。 –

関連する問題