По доброй традиции отвечаю себе сам )
Заглянул в исходники QAbstractSpinBox.. в общем, так и есть берут меню createStandardContextMenu и втыкают туда свои 3 экшена...
Единственный нюанс, который решает мою первую проблему - это надо перед каждым показом меню, его запрашивать а не пытаться его держать.
В итоге код получается примерно такой (для QLineEdit):
C++ (Qt)
...
// initialization somewhere
edit_ = new QLineEdit;
edit_->setContextMenuPolicy(Qt::CustomContextMenu);
connect(edit_, SIGNAL(customContextMenuRequested(const QPoint&)),
SLOT(custom_context_menu_requested(const QPoint&)));
...
// show context menu
void string_prop_toolbar_editor::custom_context_menu_requested(const QPoint & pos)
{
QPointer<QMenu> menu = edit_->createStandardContextMenu();
QAction* first = menu->actions().first();
menu->insertAction(first, header_action);
menu->insertAction(first, properties_action);
menu->insertAction(first, reset_to_default_action);
menu->insertSeparator(first);
menu->exec(edit_->mapToGlobal(pos));
delete static_cast<QMenu *>(menu);
}