【问题标题】:Label Won't Update标签不会更新
【发布时间】:2021-04-28 03:49:12
【问题描述】:

目前,我有一些创建 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_())

【问题讨论】:

    标签: python python-3.x pyqt pyqt5 qtablewidget


    【解决方案1】:

    问题是因为每次创建一个新的qlabel(带有所有其他元素)时,所以在选择“n”倍时,qtableWidget项目会有QstackedWidget中的“n + 1”页面,但您始终显示第二页。解决方案是只创建 2 个页面并更改 QLabel 文本:

    def MainMenu(self):
        # ..
    
        vboxMainMenu = QtWidgets.QVBoxLayout()
        vboxMainMenu.addLayout(hboxList)
        vboxMainMenu.addStretch()
    
        self.stack1.setLayout(vboxMainMenu)
    
        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)
    
    def GoToMenu(self, eve):
        self.Stack.setCurrentIndex(0)
    
    def cell_was_clicked(self, row, column):
        item = self.Table.item(row, 0)
        self.lbl.setText("" if item is None else item.text())
        self.Stack.setCurrentIndex(1)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多