2

使用 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

4 回答 4

9

您不能以您想要的方式将 a 分配给QActiona QPushButtonQPushButton不会重新定义addAction,因此行为来自QWidget.addAction将操作添加到按钮的上下文菜单。

但是,您可以将操作分配给QToolButtonsetDefaultAction更改按钮标题并在单击时触发操作的 a。

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

于 2013-05-22T23:40:48.963 回答
2

正如在其他回答中指出的那样,单击按钮时添加动作不会“运行”该动作,这是设计使然。如果您要重用或参考 QAction 的行为,您只需将 的clicked()信号连接QPushButtontrigger()QAction

QtCore.QObject.connect(self.__menuFile,
                       QtCore.SIGNAL("clicked()"),
                       self.__actionOpen.trigger)

这样,只要单击按钮,self.__actionOpen就会触发该操作。self.menuFile

于 2016-11-14T22:05:59.577 回答
0

您可以创建一个 PushButtonAction:

h 文件:

#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()));
}
于 2014-05-15T22:32:17.420 回答
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()
于 2021-03-14T06:08:16.690 回答