Переопределение виджета QLabel в PyQT

Я новичок в PyQt возможно, именно поэтому сталкиваюсь с этой проблемой. Я пытаюсь сделать компонент вставки для листов Excel. Для этого я использую QT для интерфейса и использую Qlabels в родительском классе QMainWindow, На основании позиции, выбранной из Qlist Виджет, мало Qlabels должен измениться на mainwindow динамически компонент вставки

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

Код ниже показывает, что всякий раз, когда нажимается кнопка "Выбрать", label2 (Qlabel2), как я могу удалить предыдущую метку при каждом нажатии кнопки выбора, чтобы новая метка динамически заменяла старую метку.

Заранее большое спасибо.

def Display(self):
    self.close()
    label1 = QtGui.QLabel("Select the sheet",self)
    label1.move(0,15)
    self.listwidget = QtGui.QListWidget(self)
    self.listwidget.move(0,40)
    self.listwidget.resize(150,150)
    for i in range(len(self.sheetnames)):
        self.listwidget.addItem("%s"%self.sheetnames[i])

    btn = QtGui.QPushButton('Select',self)
    btn.resize(50,50)
    btn.move(170,40)
    btn.clicked.connect(self.Selected)
    self.show()
def Selected(self):
    self.close()
    selecteditem = self.listwidget.currentItem().text()
    self.sheetindex = self.sheetnames.index(selecteditem)
    print self.sheetindex
    aa = self.loadsheet.sheet_by_name(selecteditem)
    global label2
    label2 = QtGui.QLabel("",self)
    label2.setText(selecteditem)
    label2.move(0,190)
    self.show()


    self.InputParameters(aa)

1 ответ

Вы видите новый QLabel потому что вы создаете новый каждый раз, когда вы звоните Selected, Я бы инициировал пользовательский интерфейс при создании виджета (в __init__ метод):

def __init__(self):
     self.label2 = QtGui.QLabel("",self)

И только обновлять текст Qlabel когда Selected выполняется:

def Selected(self):
     self.label2.setText(selecteditem)

О повторной инициализации всех ярлыков с неизвестным количеством ярлыков и удалении старых, вы можете посмотреть на QLabel.setParent(None), Я написал вам маленький пример:

from PyQt4 import QtGui, QtCore
import sys

class test(QtGui.QWidget):

     def __init__(self,parent=None):

         self.widget=QtGui.QWidget.__init__(self, parent)

         # Button to add labels
         self.btnAdd = QtGui.QPushButton('Add')
         self.btnAdd.connect(self.btnAdd, QtCore.SIGNAL('clicked()'),self.btnAddPressed)

        # Button to remove labels
        self.btnRemove = QtGui.QPushButton('Remove')
        self.btnRemove.connect(self.btnRemove, QtCore.SIGNAL('clicked()'), self.btnRemovePressed)

        # List to keep track of labels
        self.labels=[]

        # Layout
        self.hbox = QtGui.QHBoxLayout()
        self.hbox.addWidget(self.btnAdd)
        self.hbox.addWidget(self.btnRemove)
        self.setLayout(self.hbox)   


        self.show()

    def btnAddPressed(self):

        """Adds a new label."""

        self.labels.append(QtGui.QLabel("lbl"+str(len(self.labels)+1), self))
        self.hbox.addWidget(self.labels[-1])    

    def btnRemovePressed(self):

        """Removes last label."""

        self.labels[-1].setParent(None)
        self.labels.pop(-1)


def main():

    #Creating application   
    app = QtGui.QApplication(sys.argv)

    main_win = test()
    sys.exit(app.exec_())

if __name__ == '__main__':
     main() 
Другие вопросы по тегам