识别 QAction 的触发器

Posted

技术标签:

【中文标题】识别 QAction 的触发器【英文标题】:identify a trigger of QAction 【发布时间】:2016-11-26 18:27:57 【问题描述】:

下面我引用了我的代码。这个问题很容易描述。 selectedItem->text 不是区分菜单中选择的操作的正确方法。怎么做才对?

void RView::ShowContextMenu(const QPoint& pos) // this is a slot

// for most widgets
QPoint globalPos = statusWidget->mapToGlobal(pos);
// for QAbstractScrollArea and derived classes you would use:
// QPoint globalPos = myWidget->viewport()->mapToGlobal(pos);

QMenu myMenu;
myMenu.addAction("first");
myMenu.addAction("second");

QAction* selectedItem = myMenu.exec(globalPos);
if (selectedItem)
 
    if(selectedItem->text == "first")
     // do something 
    if(selectedItem->text == "second")
     // do other stuff

else

    // nothing was chosen


【问题讨论】:

怎么做才对?最有可能使用信号和槽。将您的 QAction 触发信号连接到您的 RView 类中的插槽。 【参考方案1】:

您应该直接比较 QActions,或者像在 ifs 中那样使用 selectedItem 的比较,或者更好地将每个操作连接到所需的插槽(或者 lambda,如果它们是一次性的本地化到这个上下文)。

QMenu myMenu;
QAction *action1 = myMenu.addAction("first");
QAction *action2 = myMenu.addAction("second");
connect(action1, &QAction::triggered, []()/*lambda code here*/);
connect(action2, &QAction::triggered, []()/*lambda code here*/);
myMenu.exec(statusWidget->mapToGlobal(pos));

编辑:对于 Qt4,您将使用插槽和旧的连接语法:

QMenu myMenu;
QAction *action1 = myMenu.addAction("first");
QAction *action2 = myMenu.addAction("second");
connect(action1, SIGNAL(triggered()), this, SLOT(doStuff()));
connect(action2, SIGNAL(triggered()), this, SLOT(doOtherStuff()));
myMenu.exec(statusWidget->mapToGlobal(pos));

为此,您需要在标题中将“doStuff”和“doOtherStuff”声明为不带参数的插槽(因为信号QAction::triggered() 没有参数)。您想要完成的代码将转到这些插槽的定义:

class RView

public slots:
    void doStuff()  /*do stuff*/ 
    void doOtherStuff()  /*do other stuff*/ 
;

【讨论】:

编译器不知道触发 对不起,应该是 QAction,而不是 QObject。更正了它。触发该操作时,您需要执行 lambda 代码。 OP中的“//做某事”和“//做其他事情”。 当动作被触发时你想执行什么。要为此使用 lambda,假设您使用的是 Qt5 的某个版本。 触发还是未知。你需要知道吗?我的意思是每个菜单项应该有 1 个操作。每个动作都有自己的 lambda 来执行该动作的代码。 您使用的是 Qt5 吗?也许你需要包含 如果你使用 Qt4 lambdas 将不起作用。

以上是关于识别 QAction 的触发器的主要内容,如果未能解决你的问题,请参考以下文章

QSignalMapper 和 QAction 的问题永远不会触发 Slot

如何获得禁用的 QAction 元素的触发信号?

通过 QtGui.QAction 将参数传递给触发的方法

防止 QMenu 在其 QAction 之一被触发时关闭

QAction 触发信号将参数传递给 Slot

Pyside2 QAction 会自动触发一次,但不会在用户单击菜单时触发