确定 QAction 的触发器
identify a trigger of QAction
下面我引用了我的代码。这个问题很容易描述。 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
,或者像在 if
中那样使用 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" 声明为不带任何参数的 header 中的插槽(因为信号 QAction::triggered()
具有 none).您想要完成的代码将转到这些插槽的定义:
class RView
{
public slots:
void doStuff() { /*do stuff*/ }
void doOtherStuff() { /*do other stuff*/ }
};
下面我引用了我的代码。这个问题很容易描述。 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
,或者像在 if
中那样使用 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" 声明为不带任何参数的 header 中的插槽(因为信号 QAction::triggered()
具有 none).您想要完成的代码将转到这些插槽的定义:
class RView
{
public slots:
void doStuff() { /*do stuff*/ }
void doOtherStuff() { /*do other stuff*/ }
};