PyQt:可以为QPushButton分配QAction吗?

时间:2013-05-22 23:10:16

标签: python qt pyqt4 qpushbutton qaction

使用Python 3.2x和PyQT 4.8x:

我初始化了一个动作并分配到一个菜单项:

self.__actionOpen = QtGui.QAction(self.__mw)
self.__actionOpen.setObjectName("actionOpen")
self.__actionOpen.setText("OpenFile")
QtCore.QObject.connect(self.__actionOpen, QtCore.SIGNAL("triggered()"), self.__accessFile)
self.__menuFile.addAction(self.__actionOpen)

工作正常 - 菜单项带有标题“OpenFile”,并且调用了动作信号/插槽。

我尝试使用QPushButton - 相同的QAction对象:

self.__buttonFile.addAction(self.__actionOpen)

没有:按钮上没有标题,单击时没有任何反应。

行动不适用于QButton(addAction调用没有抱怨......)?或者我的代码有问题吗?也许“triggered()”信号不适合与QPushButton交互的动作?

4 个答案:

答案 0 :(得分:7)

您无法按照自己的方式将QAction分配给QPushButtonQPushButton不会重新定义addAction,因此行为来自QWidget.addAction,它会将操作添加到按钮的上下文菜单中。

但是,您可以使用setDefaultAction将操作分配给QToolButton,这会更改按钮标题并在点击时触发操作。

或者您可以通过子类化QPushButton并添加setDefaultAction方法来手动执行此操作,该方法将根据操作(标题,工具提示...)更改按钮中的所有内容并连接相关按钮向行动的插槽发出信号。

答案 1 :(得分:2)

正如在其他答案中所指出的,添加动作不会在单击按钮时“运行”动作,这是设计的。如果您要重用或参考QAction的行为,您只需将clicked()的{​​{1}}信号连接到QPushButton的{​​{1}}:

trigger()

这样,只要点击QAction按钮,就会触发QtCore.QObject.connect(self.__menuFile, QtCore.SIGNAL("clicked()"), self.__actionOpen.trigger) 操作。

答案 2 :(得分:0)

你可以创建一个PushButtonAction:

h file:

#ifndef PUSHBUTTONACTION_H
#define PUSHBUTTONACTION_H
#include <QAction>
#include <QPushButton>

class PushButtonAction: public QPushButton
{
    Q_OBJECT
public:
    PushButtonAction(QAction *action, QWidget *parent = 0);
};

#endif // PUSHBUTTONACTION_H

cpp文件:

#include "pushbuttonaction.h"

PushButtonAction::PushButtonAction(QAction *action, QWidget *parent):
    QPushButton(parent)
{
    setIcon(action->icon());
    setText(action->text());
    connect(this, SIGNAL(clicked()), action, SLOT(trigger()));
}

答案 3 :(得分:0)

我对这个问题的解决方案:

from PyQt5.QtCore import pyqtSlot
from PyQt5.QtWidgets import QPushButton

class QActingPushButton(QPushButton):
    """QPushButtons don't interact with their QActions. This class triggers
    every `QAction` in `self.actions()` when the `clicked` signal is emitted.
    https://stackoverflow.com/a/16703358
    """
    def __init__(self, *args, **kwargs) -> None:
        super().__init__(*args, **kwargs)
        self.clicked.connect(self.trigger_actions)

    @pyqtSlot()
    def trigger_actions(self) -> None:
        for act in self.actions():
            act.trigger()