Достаточно легко выполнить половину необходимой функциональности. Просто создайте меню «Правка» вместе с необходимыми QActions (copy / paste / undo / etc.) В вашем классе главного окна и подключите их к слотам. В слотах эмулируйте правильные события нажатия и отпускания клавиш (например, Ctrl + C для копирования) и отправьте их в текущий фокусированный виджет. В коде что-то вроде этого:
MainWindow::MainWindow(...)
{
...
connect( actionCopy, SIGNAL( triggered()), SLOT( copy()));
...
}
...
void MainWindow::copy()
{
QWidget* focused = QApplication::focusWidget();
if( focused != 0 )
{
QApplication::postEvent( focused,
new QKeyEvent( QEvent::KeyPress,
Qt::Key_C,
Qt::ControlModifier ));
QApplication::postEvent( focused,
new QKeyEvent( QEvent::KeyRelease,
Qt::Key_C,
Qt::ControlModifier ));
}
Конечно, это довольно взломать. Вам нужно изменить код для каждой целевой платформы, изменив сочетания клавиш на правильные, и может случиться так, что виджет, который получает фокус, делает что-то неожиданное с Ctrl + C. На мой взгляд, худшим недостатком этого метода является то, что вы не можете правильно управлять включенным состоянием пунктов меню «Правка». Невозможно запросить из общего виджета, возможна ли операция копирования или вставки.
Я не могу найти реальное решение этой проблемы - и был бы удивлен, обнаружив, что она существует - поскольку функция копирования / вставки обычно скрыта внутри кода класса и не раскрывается никаким стандартным набором сигналов / слоты. После сегодняшних экспериментов с функциональностью я решил просто забыть иметь меню «Правка» из моего приложения и ожидать, что пользователи будут знать сочетания клавиш или использовать контекстные меню.