标签不会更新
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)
目前,我有一些创建 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)