определить триггер 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
}
}

2

Решение

Вы должны скорее сравнить QActionS и либо использовать сравнение selectedItem как вы делаете в своем ifs или, что еще лучше, подключите каждое действие к желаемому слоту (или лямбде, если они одноразово связаны с этим контекстом).

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*/ }
};
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]