使用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交互的动作?
答案 0 :(得分:7)
您无法按照自己的方式将QAction
分配给QPushButton
。 QPushButton
不会重新定义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()