我有一個自定義小部件,用於在選項卡小部件中創建多個選項卡。在這個自定義小部件中,我有一個按鈕來發送消息。在sending_message
方法予取數據PyQt:插槽執行很多次
signal_mapper = QtCore.QSignalMapper()
self.send_btn.clicked.connect(self.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)
您是否在QTabWidget的所有選項卡中初始化此信號,然後將其連接到某個通用插槽? 一個快速的解決方法可能是不將它連接到一個通用插槽('self.parent()。do_something()'),但將它連接到實例方法作爲插槽,然後執行: 'if self。 isVisible():self.parent()。do_something()'。 這樣,它只從當前可見的選項卡發出。 –
我是pyqt的初學者,請問你能否給我一個具體的例子 –
很少有問題(也可以,請不要通過FB聯繫我,我知道它是公開的,我願意幫忙,但只是在這裏請求SO )。 在'MainWindow'中定義'send_btn'而不是在每個單獨的選項卡中定義?這很奇怪,我不確定它會如何表現,它應該由每個新標籤重新排列。 –