在 PyQt5 中按下时如何切换按钮文本

Posted

技术标签:

【中文标题】在 PyQt5 中按下时如何切换按钮文本【英文标题】:How to toggle button text when pressed in PyQt5 【发布时间】:2019-04-08 05:40:39 【问题描述】:

我正在尝试使用 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

这让我知道按下了哪个按钮,以便我可以继续播放歌曲。按照示例给出here 我尝试使用setText,但我没有看到可见的文本更改。关于如何做到这一点的任何建议?谢谢!

编辑:

代表我的错误。无论按下哪个按钮,最后创建的按钮都会更改为暂停。我可以使用index.row() 以某种方式索引按钮按下以进行切换吗?

【问题讨论】:

【参考方案1】:

永远不要在循环中创建属性,在你的情况下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")

【讨论】:

谢谢,这按预期工作。但是我在btn_play = QtWidgets.QPushButton(text="Play", clicked=self.handle_play_button) 收到了两个意外的参数警告参数。我不确定为什么会这样 @Rrz0 尝试更改为:btn_play = QtWidgets.QPushButton("Play") btn_play.clicked.connect(self.handle_play_button) 是的,将恢复到以前的语法,谢谢。我还认为self.tableWIdget.clear() 命令删除了先前设置的列名,所以我将对其进行注释。 (只是未来参考的指针)

以上是关于在 PyQt5 中按下时如何切换按钮文本的主要内容,如果未能解决你的问题,请参考以下文章

如何检测在 PyQt5 中按下了动态添加的按钮之一? [复制]

PyQt5 QPushButton setSyleSheet 按下时不改变按钮颜色

如何在nib文件中按下时禁用UIButton高亮显示?

在 ScrollView 中按下时的中心元素

UI在android studio中按下时闪烁

如何在按钮按下时通过动画进行文本转换?