python - 在 PyQt5 中按下时如何切换按钮文本
问题描述
我正在尝试使用 PyQt5 按下时更改按钮文本。我有一个填充表,每行都有一个按钮。最初该按钮应显示“播放”,一旦按下它应显示“暂停”。
我使用以下方法填充表格并处理按钮按下:
def populate_table(self, total, my_songs):
self.create_rows(total)
btn_press = 0
for row in range(total):
for col in range(4):
self.tableWidget.setItem(row, 0, QtWidgets.QTableWidgetItem(str(my_songs[row].get_title())
.strip('"\'')))
self.tableWidget.setItem(row, 1, QtWidgets.QTableWidgetItem(str(my_songs[row].get_artist())
.strip('"\'')))
self.tableWidget.setItem(row, 2, QtWidgets.QTableWidgetItem(str(my_songs[row].get_album())
.strip('"\'')))
self.tableWidget.setItem(row, 3, QtWidgets.QTableWidgetItem(str(my_songs[row].get_length())
.strip('"\'')))
# self.tableWidget.setItem(row, 4, QtWidgets.QPushButton('Play'))
self.btn_play = QPushButton("Play", self)
self.btn_play.clicked.connect(lambda: self.handle_play_button(self.btn_press))
self.tableWidget.setCellWidget(row, 4, self.btn_play)
def handle_play_button(self, btn_press):
button = QtWidgets.qApp.focusWidget()
# or button = self.sender()
index = self.tableWidget.indexAt(button.pos())
if index.isValid():
self.btn_press += 1
print(index.row(), index.column(), btn_press)
self.btn_play.setText("Pause") #This does not work
这让我知道按下了哪个按钮,这样我就可以继续播放这首歌了。按照此处给出的示例, 我尝试使用setText
,但没有看到可见的文本更改。关于如何做到这一点的任何建议?谢谢!
编辑:
代表我的错误。无论按下哪个按钮,最后创建的按钮都会更改为暂停。我可以用index.row()
某种方式索引按钮按下以进行切换吗?
解决方案
永远不要在循环中创建属性,在您的情况下,您self.btn_play
将指向哪个按钮?然后到最后,因此它对我们不起作用。如果类是小部件,则使用 focusWidget() 或使用 sender 获得的按钮。
def populate_table(self, my_songs):
self.tableWidget.clear()
self.tableWidget.setColumnCount(5)
for row, data in enumerate(my_songs):
self.tableWidget.insertRow(self.tableWidget.rowCount())
self.tableWidget.setItem(row, 0, QtWidgets.QTableWidgetItem(str(my_songs[row].get_title())
.strip('"\'')))
self.tableWidget.setItem(row, 1, QtWidgets.QTableWidgetItem(str(my_songs[row].get_artist())
.strip('"\'')))
self.tableWidget.setItem(row, 2, QtWidgets.QTableWidgetItem(str(my_songs[row].get_album())
.strip('"\'')))
self.tableWidget.setItem(row, 3, QtWidgets.QTableWidgetItem(str(my_songs[row].get_length())
.strip('"\'')))
btn_play = QtWidgets.QPushButton(text="Play", clicked=self.handle_play_button)
self.tableWidget.setCellWidget(row, 4, btn_play)
@QtCore.pyqtSlot()
def handle_play_button(self):
btn = QtWidgets.qApp.focusWidget()
# btn = self.sender()
if btn is not None:
text = btn.text()
btn.setText("Pause" if text == "Play" else "Play")
推荐阅读
- javascript - 滚动时间轴上的颜色变化
- python - 如何在 \ 中使用三引号
- java - Java 使用来自其他方法的用户输入
- .net - 如果在容器内运行的集成测试失败,我该如何中断 Azure DevOps 管道?
- python - 无法在 Raspberry Pi4 上播放使用 OpenCV 4.4.0 录制的视频
- conan - 打包构建环境为profile的build_requires,使用系统编译器代替
- laravel - 为 2 个页面创建 2 个 vue 实例时出错(在项目 laravel + vuejs 中)
- postgresql - Aurora 无服务器 Postgresql 无法通过 TLS/SSL 连接
- linux - 将管道分为 3 个不同的进程并匹配第二个匹配项
- go - time.Sleep 导致不良行为