我有一些QAction并在许多QMenu小部件中添加了相同的QAction。 所有操作都连接到同一个插槽。我想知道触发QMenu的行动。
答案 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
应用程序如下所示:
我用鼠标点击了这三个动作并获得了以下输出:
Action triggered: action1
Action triggered: action2
Action triggered: action3
这实际上不是一个共享QAction
- 它是三个具有相同标签文本和单独lambda的行为。
lambdas已被用作适配器来摆脱bool
的未使用的QAction::triggered(bool)
参数并改为绑定字符串。
注意:
我使用QToolBar
代替QMenu
来保持样本更紧凑。但是,原则是一样的。