PyQt:QPushButton可以被分配一个QAction吗?

2024-05-02 02:31:30 发布

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

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

Works fine-菜单项有标题“OpenFile”,并调用操作信号/插槽。

我用一个QPushButton尝试过-相同的QAction对象:

self.__buttonFile.addAction(self.__actionOpen)

什么都没有:按钮上没有标题,单击时什么也不会发生。

操作不适用于QButton(addAction调用没有抱怨…)?还是我的代码有问题?也许“trigged()”信号不适合与QPushButton交互的操作?


Tags: self标题信号pyqtmw菜单项settextqtgui
3条回答

正如在其他回答中指出的,添加一个操作不会在单击按钮时“运行”该操作,这是按设计的。如果您所追求的是重用或引用QAction的行为,您可以将QPushButtonclicked()信号连接到QActiontrigger()

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

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

您可以创建一个按钮操作:

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()));
}

不能按所需方式将QAction分配给QPushButtonQPushButton没有重新定义addAction,因此行为来自QWidget.addAction,它将操作添加到按钮的上下文菜单中。

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

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

相关问题 更多 >