首页 > 解决方案 > 单击时获取动态创建按钮的 ID

问题描述

我有一个程序可以动态创建带有按钮的选项卡,当用户单击按钮时,我希望它给我 button_id(对应于选项卡索引的数字)。

我知道您可以执行 tabwidget.currentIndex() 之类的操作来获取正在使用的选项卡的索引,但我不希望这样做,因为我最终会有一个方法可以遍历选项卡的数量并在不选择选项卡的情况下访问每个按钮如下所示。

    for i in range(1,self.tabWidget.count()):
        self.tabWidget.widget(i).stagematch.click()

例如:

如果用户单击“选项卡 2”上的“清除文本”按钮,那么我希望它返回数字 2。

如何在不使用选项卡的 currentIndex() 方法的情况下完成此操作

测试代码:

import sys
from PyQt5 import QtCore, QtWidgets

class TabPage(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)
        group = QtWidgets.QGroupBox('Monty Python')
        layout = QtWidgets.QVBoxLayout(self)
        layout.addWidget(group)
        grid = QtWidgets.QGridLayout(group)
        testbutton = QtWidgets.QPushButton('Clear Text')
        grid.addWidget(testbutton, 2, 2)

        testbutton.clicked.connect(self.tab_match)
        #testbutton.clicked.connect(self.button_id)

    def button_id(self):
        sender = self.sender()
        print(sender.text()) # Gives text of button, i'd like a number that corresponds to the tab# that called it

    def tab_match(self,button_id):
        #Do something with button ID here
        pass

class Window(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()
        self.tabs = QtWidgets.QTabWidget()
        layout = QtWidgets.QVBoxLayout(self)
        layout.addWidget(self.tabs)
        button = QtWidgets.QToolButton()
        button.setToolTip('Add New Tab')
        button.clicked.connect(self.addNewTab)
        button.setIcon(self.style().standardIcon(
            QtWidgets.QStyle.SP_DialogYesButton))
        self.tabs.setCornerWidget(button, QtCore.Qt.TopRightCorner)
        self.addNewTab()

    def addNewTab(self):
        text = 'Tab %d' % (self.tabs.count() + 1)
        self.tabs.addTab(TabPage(self.tabs), text)

if __name__ == '__main__':

    app = QtWidgets.QApplication(sys.argv)
    window = Window()
    window.setGeometry(600, 100, 300, 200)
    window.show()
    sys.exit(app.exec_())

标签: python-3.xpyqt5

解决方案


试试看:

import sys
from PyQt5 import QtCore, QtWidgets

class TabPage(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)

        self.parent = parent                                                 # +
        self.button_id = 0                                                   # +

        group = QtWidgets.QGroupBox('Monty Python')
        layout = QtWidgets.QVBoxLayout(self)
        layout.addWidget(group)
        grid = QtWidgets.QGridLayout(group)
        testbutton = QtWidgets.QPushButton('Clear Text')
        grid.addWidget(testbutton, 2, 2)

        testbutton.clicked.connect(self.tab_match)
        self.parent.currentChanged.connect(self.qtabwidget_currentchanged)   # +

    def tab_match(self): 
        #Do something with button ID here
        print("\ndef tab_match: button_id-> {}".format(self.button_id))      # +

    @QtCore.pyqtSlot(int)
    def qtabwidget_currentchanged(self, index):                              # +
        self.button_id = index 


class Window(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()
        self.tabs = QtWidgets.QTabWidget()
        layout = QtWidgets.QVBoxLayout(self)
        layout.addWidget(self.tabs)
        button = QtWidgets.QToolButton()
        button.setToolTip('Add New Tab')
        button.clicked.connect(self.addNewTab)
        button.setIcon(self.style().standardIcon(
            QtWidgets.QStyle.SP_DialogYesButton))
        self.tabs.setCornerWidget(button, QtCore.Qt.TopRightCorner)

        self.button_id = 0
        self.addNewTab()

    def addNewTab(self):
        text = 'Tab %d' % (self.tabs.count() + 1)
        self.tabs.addTab(TabPage(self.tabs), text)


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    window = Window()
    window.setGeometry(600, 100, 300, 200)
    window.show()
    sys.exit(app.exec_())

在此处输入图像描述


推荐阅读