Как реализовать меню «Правка» с помощью «Отменить», «Вырезать», «Вставить» и «Копировать»? - PullRequest
7 голосов
/ 12 января 2010

Привет,

для одного из моих приложений я пытаюсь реализовать меню «Правка». В этом меню обычно есть стандартные пункты Отменить , Вырезать , Копировать и Вставить .

Это меню по умолчанию отсутствует, и пользователи, похоже, ожидают его, особенно в Mac OS X.

Есть ли более простой способ реализовать это, не делая это в каждом виджете вручную? Поскольку большинство виджетов уже имеют механизм копирования / вставки / отмены, уже реализованный с помощью ярлыков, я хотел бы предоставить несколько простых действий меню, которые также вызывают их.

Действия должны сначала вызывать любой виджет, имеющий фокус, затем, я думаю, они должны передавать события вверх по цепочке объектов.

Я использую Qt 4.6 в Windows, Linux и Mac OS X.

Спасибо!

Ответы [ 3 ]

6 голосов
/ 04 марта 2010

Достаточно легко выполнить половину необходимой функциональности. Просто создайте меню «Правка» вместе с необходимыми 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. На мой взгляд, худшим недостатком этого метода является то, что вы не можете правильно управлять включенным состоянием пунктов меню «Правка». Невозможно запросить из общего виджета, возможна ли операция копирования или вставки.

Я не могу найти реальное решение этой проблемы - и был бы удивлен, обнаружив, что она существует - поскольку функция копирования / вставки обычно скрыта внутри кода класса и не раскрывается никаким стандартным набором сигналов / слоты. После сегодняшних экспериментов с функциональностью я решил просто забыть иметь меню «Правка» из моего приложения и ожидать, что пользователи будут знать сочетания клавиш или использовать контекстные меню.

0 голосов
/ 25 августа 2015

Решение user285740 мне не помогло, так как я использую в своем приложении элемент управления браузером (CEF или WebKit, не имеет значения).

Почему? Для браузеров focusWidget() всегда представляется NULL, поскольку элементы <input> не являются виджетами. Я пробовал postEvent() для других виджетов - не работает. Добавление пунктов меню со QAction::TextHeuristicRole + стандартными последовательностями, такими как QKeySequence::Copy, тоже не сработало (я мог подключать их только к своим слотам, а не к стандартным слотам). Пример Cefclient загружает файл xib, но это не вариант для меня, так как Qt создает все с нуля.

В конце концов, я нашел решение! Создайте те же пункты меню из кода ObjectiveC ++. Они действуют как те, что созданы с помощью QMenuBar, но (!) Они могут быть связаны с некоторыми реальными автоматическими действиями, такими как @selector(copy:)

Вы можете найти пример здесь: nsMenuUtilsX :: GetStandardEditMenuItem () , просто сделайте это из своего кода ObjC ++.

Но этот код не будет работать, если вы выполните его до QApplication::exec(). Qt затем программно «переписывает» главное меню ... Как это исправить? Ну, может быть, я добавлю несколько хаков, таких как QTimer. Это не будет сделано, если вы не попытаетесь добавить другие элементы через QMenuBar. Теперь все в порядке! Qt-независимое меню.

0 голосов
/ 12 января 2010

У меня сложилось впечатление, что меню «Правка» относится к центральному виджету документа, а не к множеству маленьких. Я не проверял, но если у вас есть форма с QLineEdits, действительно ли меню «Правка» (в строке меню) применимо к этому виджету. Разве вам не нужно просто вызвать контекстное меню или нажать ярлыки для доступа к этим параметрам ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...