Как избежать дублирования элементов на PyQt? - PullRequest
0 голосов
/ 06 февраля 2019

Я разрабатываю графический интерфейс на основе PyQt4.GUI - это в основном Qtabwidget в окне.Идея состоит в том, что каждый раз, когда окно получает сигнал, это добавляет новую вкладку методом add_tab.Когда сигнал принимается в первый раз, он работает отлично, создается tab_0, но при следующей попытке он дважды создает tab_1, а при следующей попытке создает три вкладки tab_2 и так далее.Кто-нибудь может объяснить мне, что происходит и как это исправить?Я думаю, что это связано с введите описание изображения здесь изменяемая тема, но я не уверен.

Заранее спасибо !!!это мой код:

class MyWindow(QtGui.QWidget):
    recive=QtCore.pyqtSignal(str)
    def __init__(self,parent=None):
        super(MyWindow, self).__init__(parent)
        QtGui.QWidget.__init__(self)
        self.setWindowTitle(_translate("Form", "Form", None))
        self.setObjectName(_fromUtf8("Form"))
        self.resize(695, 577)
        self.tabWidget = QtGui.QTabWidget(self)
        self.tabWidget.setGeometry(QtCore.QRect(0, 0, 691, 571))
        self.tabWidget.setAcceptDrops(False)
        self.tabWidget.setObjectName("tabWidget")

   @pyqtSlot(str)
   def add_tab(self,numero):
        self.tab = QtGui.QWidget(self.tabWidget)
        self.tab.setObjectName("tab")
        self.tabWidget.addTab(self.tab, "tab")
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), 
        _translate("Form", "mesa_"+numero, None))
        self.tabWidget.setCurrentIndex(int(numero))
        QtCore.QMetaObject.connectSlotsByName(self.tabWidget)
        self.tab.show()

if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    window=MyWindow()
    window.show()
    window.recive.connect(window.add_tab)
    window.recive.emit('0')
    window.recive.connect(window.add_tab)
    window.recive.emit('1')

    window.recive.connect(window.add_tab)
    window.recive.emit('2')
    sys.exit(app.exec_())

введите описание изображения здесь

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

Извините, у меня есть PyQt5.Оставьте один window.recive.connect(window.add_tab)

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *

class MyWindow(QWidget):

    recive = pyqtSignal(str)

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

        self.setWindowTitle("Form")
        self.resize(695, 577)

        self.tabWidget = QTabWidget(self)
        self.tabWidget.setGeometry(QRect(0, 0, 691, 571))
        self.tabWidget.setAcceptDrops(False)

    @pyqtSlot(str)
    def add_tab(self, numero):
        self.tab = QWidget(self.tabWidget)
        self.tab.setObjectName("tab")
        self.tabWidget.addTab(self.tab, "tab")
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), "mesa_"+numero) 
        self.tabWidget.setCurrentIndex(int(numero))


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MyWindow()
    window.show()

    window.recive.connect(window.add_tab)
    window.recive.emit('0')

#    window.recive.connect(window.add_tab)      # <---
    window.recive.emit('1')

#    window.recive.connect(window.add_tab)      # <---
    window.recive.emit('2')

    sys.exit(app.exec_())

enter image description here

0 голосов
/ 06 февраля 2019

Это зависит от вашего способа подключения событий:

QtCore.QMetaObject.connectSlotsByName(self.tabWidget)

Каждый раз, когда вызывается метод add_tab, регистрируется новое соединение.Быстрый обходной путь - отключить существующие сигналы раньше.

Однако я не уверен, как это сделать, когда были установлены соединения с connectSlotsByName ...

Полезные советы по подключению и отключению сигналов можно найти там

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...