标签不会更新

Label Won't Update

目前,我有一些创建 QTableWidget 的代码。当您单击 QTableWidget 单元格时,会出现一个标签,显示您单击的项目的名称。然后,顶部有一个菜单按钮,单击该按钮后,您将返回到 QTableWidget。我使用 QStackedWidgets 执行此操作,并且第一次一切正常。但是,我第二次单击某个项目时,标签不会更改其文本。例如,如果我第一次单击名为 "NUM 1" 的 QTableWidget 单元格,标签将显示文本 NUM 1。然后,我单击菜单按钮。然而,当我第二次点击不同的单元格时,例如 "NUM 2",标签没有改变,仍然显示 NUM 1.

我该如何解决这个问题。我试过使用 label.update(),但它不起作用。

这是我的代码:

from PyQt5 import QtWidgets, QtCore, QtGui
import sys

class MyWindow(QtWidgets.QMainWindow):

    #Define The Init
    def __init__(self):
        super(MyWindow, self).__init__()

        self.ID = ""
        self.initUI()
        self.setGeometry(200, 200, 1325, 955)

        self.menuButton = QtWidgets.QLabel(self)
        self.menuButton.setText("Menu")    
        
        self.menuButton.mousePressEvent = self.GoToMenu

        Central = QtWidgets.QWidget(self)
        self.setCentralWidget(Central)

        self.stack1 = QtWidgets.QWidget()
        self.stack2 = QtWidgets.QWidget()

        self.MainMenu()

        self.Stack = QtWidgets.QStackedWidget(self)
        self.Stack.addWidget(self.stack1)
        self.Stack.addWidget(self.stack2)

        vboxMain = QtWidgets.QVBoxLayout()

        hbox = QtWidgets.QHBoxLayout(self)
        hbox.addWidget(self.menuButton)
        hbox.setAlignment(QtCore.Qt.AlignTop | QtCore.Qt.AlignCenter)

        vboxMain.addLayout(hbox)
        vboxMain.addWidget(self.Stack)

        Central.setLayout(vboxMain)
        self.Stack.setCurrentIndex(0)    

    def initUI(self):
        pass

    def MainMenu(self):
        self.Table = QtWidgets.QTableWidget()

        self.Table.setMouseTracking(True)

        self.rowName = ["NUM 1", "NUM 2", "NUM 3", "NUM 4"]
        
        self.Table.setColumnCount(2)
        self.Table.setRowCount(len(self.rowName))

        self.verticalHeader = self.Table.verticalHeader()
        
        self.Table.verticalHeader().setVisible(False)
        
        self.Table.setFocusPolicy(QtCore.Qt.NoFocus)

        self.horizontalHeader = self.Table.horizontalHeader()
        self.horizontalHeader.setSectionResizeMode(0, QtWidgets.QHeaderView.Stretch)
        self.horizontalHeader.setDefaultAlignment(QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter)

        self.Table.setHorizontalHeaderLabels(("Name;Point").split(";"))

        for section in range(self.verticalHeader.count()):
            self.Table.setItem(section, 0, QtWidgets.QTableWidgetItem(self.rowName[section]))

        self.Table.cellClicked.connect(self.cell_was_clicked)

        hboxList = QtWidgets.QHBoxLayout()
        hboxList.addStretch()
        hboxList.addWidget(self.Table)
        hboxList.addStretch()

        vboxMainMenu = QtWidgets.QVBoxLayout()
        vboxMainMenu.addLayout(hboxList)
        vboxMainMenu.addStretch()

        self.stack1.setLayout(vboxMainMenu)

    def GoToMenu(self, eve):
        self.Stack.setCurrentIndex(0)

    def cell_was_clicked(self, row, column):
        self.ViewLabel(self.Table.item(row, 0).text())
        self.Stack.setCurrentIndex(1)

    def ViewLabel(self, IDL):
        
        self.lbl = QtWidgets.QLabel()
        self.lbl.setText(IDL) ###...THE PROBLEM IS HERE...###

        hboxShow = QtWidgets.QHBoxLayout()
        hboxShow.addStretch()
        hboxShow.addWidget(self.lbl)
        hboxShow.addStretch()

        vboxShow = QtWidgets.QVBoxLayout()
        vboxShow.addLayout(hboxShow)

        self.stack2.setLayout(vboxShow)

app = QtWidgets.QApplication(sys.argv)
win = MyWindow()

win.show()
sys.exit(app.exec_())

The problem is caused because every time you are creating a new QLabel (with all the other elements), so when selecting "n" times the QTableWidget items there will be "n + 1" pages in the QStackedWidget but you总是显示第二页。解决方案是只创建 2 个页面并更改 QLabel 文本:

def MainMenu(self):
    # ..

    vboxMainMenu = QtWidgets.QVBoxLayout()
    vboxMainMenu.addLayout(hboxList)
    vboxMainMenu.addStretch()

    self.stack1.setLayout(vboxMainMenu)

    <b>self.lbl = QtWidgets.QLabel()

    hboxShow = QtWidgets.QHBoxLayout()
    hboxShow.addStretch()
    hboxShow.addWidget(self.lbl)
    hboxShow.addStretch()

    vboxShow = QtWidgets.QVBoxLayout()
    vboxShow.addLayout(hboxShow)

    self.stack2.setLayout(vboxShow)</b>

def GoToMenu(self, eve):
    self.Stack.setCurrentIndex(0)

def cell_was_clicked(self, row, column):
    <b>item = self.Table.item(row, 0)
    self.lbl.setText("" if item is None else item.text())</b>
    self.Stack.setCurrentIndex(1)