Qt Mac (Re) переместить действие "Специальные символы..." в меню "Правка"

Я занимаюсь разработкой приложения в Qt, которое очень часто перестраивает его меню. Однако, когда мы вызываем clear() и повторно добавляем нужные нам действия в меню, "Специальные символы...", похоже, остаются в меню. Есть ли способ удалить или переместить это действие в конец QMenu?

Вот код, который перестраивает меню:

void MainWindow::initMenus(Tab* tab)
{
menuBar()->clear();
menuFile->clear();
menuEdit->clear();
menuSettings->clear();
menuHelp->clear();
ui_toolBar->clear();

menuBar()->addMenu(menuFile);
menuBar()->addMenu(menuEdit);

menuFile->addAction(actionNew);
menuFile->addAction(actionOpen);
if(tab) tab->addActionsFile(menuFile);
menuFile->addSeparator();
menuFile->addAction(actionNext);
menuFile->addAction(actionPrevious);
menuFile->addAction(actionClose);
menuFile->addSeparator();
menuFile->addAction(actionQuit);

if(tab) {
    tab->addActionsEdit(menuEdit);
    menuEdit->addSeparator();
    tab->addActionsHelp(menuHelp);
    menuHelp->addSeparator();
}

menuEdit->addAction(actionEditor_Settings);

menuHelp->addSeparator();
menuHelp->addAction(actionAbout);

if(tab) tab->addOtherActions(menuBar());

menuBar()->addMenu(menuHelp);

ui_toolBar->addAction(actionNew);
ui_toolBar->addAction(actionOpen);
if(tab) tab->addToolbarActions(ui_toolBar);
}

Он снабжен вкладкой, которая также может добавлять свои собственные действия в меню, используя эти функции.

Параметр специальных символов в меню 'Правка'

2 ответа

Решение

Это особенность Mac OS X, которую нелегко отключить. Вы заметите, что почти у каждого приложения в Mac OS есть это. Он автоматически добавляется в меню "Правка" операционной системой, чтобы разрешить ввод международных символов.

Как видно из вашего вопроса, но не совсем понятно, что при первоначальном создании меню "Правка" элемент меню "Специальные символы..." изначально является последним элементом меню, но один раз становится первым элементом меню. editMenu->clear() был вызван. Один путь, по которому вы могли бы пойти, это вместо clear()В меню вы можете delete меню и воссоздать их полностью. Ваше меню редактирования выглядит довольно статично. Возможно это не должно быть воссоздано вообще.

Тем не менее, если вы действительно уверены, что вам нужно избавиться от этого пункта меню, есть несколько способов сделать это.

Первый и наименее желательный вариант - просто не иметь меню "Редактировать". Если нет меню "Редактировать", Mac OS не добавит пункт меню "Специальные символы".

Второй метод требует немного специфичного для платформы кода Objective-C. Очевидно, это должно быть встроено только в ваш проект на Mac OS.

MenuDeleter.m:

#include <Foundation/NSUserDefaults.h>

void deleteSpecialCharacters()
{
    [[NSUserDefaults standardUserDefaults]
        setBool:YES forKey:@"NSDisabledCharacterPaletteMenuItem"];
}

MenuDeleter.h

#ifndef MENUDELETER_H_
#define MENUDELETER_H_

void deleteSpecialCharacters();

#endif

И, наконец, в main.cpp:

#include <QApplicaiton>
#include "MenuDeleter.h"

int main(int argc, char **argv)
{
#ifdef Q_OS_MAC
    deleteSpecialCharacters();
#endif
    QApplication app(argc, argv);
    ....
    return app.exec();
}

Вот как это сделать, чтобы это полностью исчезло. Но вопрос в том, действительно ли вы хотите запретить пользователю вводить специальные символы в ваше приложение?

Этот ответ может быть более применим к приложению COCOA OSX, но я смог удалить эти пункты меню в Objective-C, получив дескриптор NSMenu для самого меню редактирования в функции applicationDidFinishLaunching, просматривая NSMenuItems в itemArray и удаляя их вызывая removeItem.

Другие вопросы по тегам