如何知道QMenu的动作是什么被触发的

时间:2018-01-29 15:51:59

标签: c++ qt

我有一些QAction并在许多QMenu小部件中添加了相同的QAction。 所有操作都连接到同一个插槽。我想知道触发QMenu的行动。

1 个答案:

答案 0 :(得分:0)

思考两次,我得出以下结论:

如果将相同的QAction添加到多个菜单中,则几乎没有机会在插槽中区分哪个菜单项已被触发。

多个菜单和工具栏可以共享

QAction个实例。但在这种情况下,它是同一个实例(具有多个父项)。使用附加参数进行区分的想法不会出于同样的原因。 QAction只有一个triggered信号的实例 - 没有机会进行区分。

以下示例是我找到的最接近的样本(testQActionShared.cc):

#include <QtWidgets>

void actionSlot(const char *text)
{
  qDebug() << "Action triggered:" << text;
}


int main(int argc, char** argv)
{
  qDebug() << "Version:" << QT_VERSION_STR;
  // main application
  QApplication app(argc, argv);
  QToolBar qToolbar;
  qToolbar.addAction(QString::fromUtf8("Action"),
    [](bool) { actionSlot("action1"); });
  qToolbar.addAction(QString::fromUtf8("Action"),
    [](bool) { actionSlot("action2"); });
  qToolbar.addAction(QString::fromUtf8("Action"),
    [](bool) { actionSlot("action3"); });
  qToolbar.show();
  // run application
  return app.exec();
}

testQActionShared.pro

SOURCES = testQActionShared.cc

QT += widgets

cygwin上的bash中编译:

$ qmake-qt5 testQActionShared.pro

$ make
g++ -c -fno-keep-inline-dllexport -D_GNU_SOURCE -pipe -O2 -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I. -isystem /usr/include/qt5 -isystem /usr/include/qt5/QtWidgets -isystem /usr/include/qt5/QtGui -isystem /usr/include/qt5/QtCore -I. -I/usr/lib/qt5/mkspecs/cygwin-g++ -o testQActionShared.o testQActionShared.cc
g++  -o testQActionShared.exe testQActionShared.o   -lQt5Widgets -lQt5Gui -lQt5Core -lGL -lpthread 

$ ./testQActionShared 

Version: 5.9.2

应用程序如下所示:

Snapshot of testQActionShared.exe

我用鼠标点击了这三个动作并获得了以下输出:

Action triggered: action1
Action triggered: action2
Action triggered: action3

这实际上不是一个共享QAction - 它是三个具有相同标签文本和单独lambda的行为。

lambdas已被用作适配器来摆脱bool的未使用的QAction::triggered(bool)参数并改为绑定字符串。

注意:

我使用QToolBar代替QMenu来保持样本更紧凑。但是,原则是一样的。