PyQt:获取菜单按钮对象名而不是菜单项

2024-04-29 01:58:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我有几个qpushbuttons和一个菜单,并试图得到一个菜单项选中的具体按钮。现在使用sender函数,我可以选择菜单项,但我需要实际的按钮来保存菜单(这里是按钮1)。在

enter image description here

class MainWindow(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)
        self.setMinimumSize(QSize(400, 400))    
        buttons= ['button1','button2','button3']
        pybutton = {}
        x=0
        t = 0
        for i in buttons:
            t = t + 100
            x+=1
            pybutton[str(x)] = QPushButton(i, self) 
            pybutton[str(x)].setObjectName('btn' + str(x))
            menu = QMenu()
            menu.addAction('item1',self.status)
            menu.addAction('item2',self.status)
            menu.addAction('item3',self.status)
            menu2 = menu.addMenu('menu2')
            menu2.addAction('item4')
            pybutton[str(x)].setMenu(menu)
            pybutton[str(x)].resize(100,100)
            pybutton[str(x)].move(400-int(t),100)
            pybutton[str(x)].setStyleSheet('QPushButton::menu-indicator { image: none; }')
        self.statusBar()
    def status(self):
        sender = self.sender()
        print('PyQt5 button click')
        self.statusBar().showMessage(sender.text() + ' was pressed')

Tags: selfinitdefstatus菜单按钮sendermenu
1条回答
网友
1楼 · 发布于 2024-04-29 01:58:00

一种可能的解决方案是使用setProperty()方法将按钮作为属性传递给每个QAction,并使用property()在槽中获得它


class MainWindow(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)
        self.setMinimumSize(QSize(400, 400))    
        texts= ['button1','button2','button3']
        pybutton = {}
        for x, (text, t) in enumerate(zip(texts, range(300,0,-100))):
            btn = QPushButton(text, self) 
            btn.setObjectName('btn{}'.format(x+1))
            btn.resize(100,100)
            btn.move(t,100)
            btn.setStyleSheet('QPushButton::menu-indicator { image: none; }')

            menu = QMenu()
            btn.setMenu(menu)
            args = ("button", btn)
            menu.setProperty(*args)
            for act in ("item1", "item2", "item3"):
                action = menu.addAction('item1',self.status)
                action.setProperty(*args)
            menu2 = menu.addMenu('menu2')
            action = menu2.addAction('item4', self.status)
            action.setProperty(*args)
            pybutton[str(x+1)] = btn

        self.statusBar()

    def status(self):
        action = self.sender()
        btn = action.property("button")
        print('PyQt5 button click')
        self.statusBar().showMessage('{} was pressed with button: {}'.format(action.text(), btn.text()))

相关问题 更多 >