Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: gil9red от Июль 08, 2012, 21:08



Название: [РЕШЕНО] Изменение названия QAction в контекстном меню QTextEdit
Отправлено: gil9red от Июль 08, 2012, 21:08
Можно ли, QAction, появляющиеся в контексном меню текстовых редакторов (QTextEdit, QLineEdit), перевести например на русский язык, так чтобы ими можно было пользоваться?

Код:
        
        QMenu *menuTextEdit = textEdit.createStandardContextMenu();

        // получаем указатели

        QAction *actionUndo      = menuTextEdit->actions().at(0);
        QAction *actionRedo      = menuTextEdit->actions().at(1);
        QAction *actionCut        = menuTextEdit->actions().at(3);
        QAction *actionCopy      = menuTextEdit->actions().at(4);
        QAction *actionPaste     = menuTextEdit->actions().at(5);
        QAction *actionSelectAll = menuTextEdit->actions().at(8);

       // в событии контексного меню:

        QMenu *menu = new QMenu();

        menu->addAction(actionCut);
        menu->addAction(actionCopy);
        menu->addAction(actionPaste);
        menu->addSeparator();
        menu->addAction(actionSelectAll);


         // добавляю свои действия
        menu->addSeparator();
        menu->addAction(actionSettings);
        menu->addSeparator();
        menu->addAction(actionHide);
        menu->addAction(actionLock);
        menu->addAction(actionUnlock);
        menu->addAction(actionDelete);
        menu->exec(point);
        delete menu;
если хочется назвать действия подругому, то меняю setText нужного мне QAction,
НО только, когда я добавляю вручную QAction в меню, почти все перестают работать (вставка (Paste) исключение)

а если получить список QAction, и добавить именно список, то все QAction работают


Название: Re: Изменение названия QAction в контекстном меню QTextEdit
Отправлено: gil9red от Июль 09, 2012, 01:20
Похоже нет.
Пришлось, выбрать альтернативный вариант: самому сделать эти QAction, благо у QTextEdit есть нужные слоты :)
Код:
        QAction *actionCut = new QAction(this);
        QAction *actionCopy = new QAction(this);
        QAction *actionPaste = new QAction(this);

        actionCut->setShortcut(QKeySequence::Cut);
        actionCopy->setShortcut(QKeySequence::Copy);
        actionPaste->setShortcut(QKeySequence::Paste);

        connect(actionCut, SIGNAL(triggered()),
                &textEdit, SLOT(cut()));
        connect(actionCopy, SIGNAL(triggered()),
                &textEdit, SLOT(copy()));
        connect(actionPaste, SIGNAL(triggered()),
                &textEdit, SLOT(paste()));


а чтобы action вели себя правильно, нужно добавить логику:

в контекстном эвенте
Код:
        QMenu *menu = new QMenu();

        QTextCursor textCursor = textEdit.textCursor();

        actionCut->setEnabled(true);
        actionCopy->setEnabled(true);
        // если не выделенно ничего
        if(textCursor.selectionEnd() - textCursor.selectionStart() <= 0)
        {
            actionCut->setEnabled(false);
            actionCopy->setEnabled(false);
        }

        actionCut->setVisible(true);
        actionPaste->setVisible(true);

        // если в тектовом редакторе возможно только считывание
        if(textEdit.isReadOnly())
        {
            actionCut->setVisible(false);
            actionPaste->setVisible(false);
        }

        menu->addAction(actionCut);
        menu->addAction(actionCopy);
        menu->addAction(actionPaste);

        menu->exec(event->globalPos());
        delete menu;

Если у кого нибудь есть идеи, как сделать, то о чем я спрашивал, проще, прощу, пишите :)


Название: Re: Изменение названия QAction в контекстном меню QTextEdit
Отправлено: Bepec от Июль 09, 2012, 07:00
Ты хочешь язык в программе менять?

Если экшены статические(созданы там в дизайнере), тогда спокойно переводится в лингвисте.

Если динамические - придётся тебе писать пару функций.

PS смотри раздел интернализация.


Название: Re: Изменение названия QAction в контекстном меню QTextEdit
Отправлено: gil9red от Июль 09, 2012, 15:07
нет, не в дизайнере, мне почему то удобнее делать вручную=)
я написал функцию:
Код:
void setLanguage(QString language);
в ней содержатся все случаи называния объектов, которое видит пользователь=)


Название: Re: Изменение названия QAction в контекстном меню QTextEdit
Отправлено: Bepec от Июль 11, 2012, 10:14
Я бы сказал что это плохо. Очень дюже.

Надо использовать уже имеющиеся возможности Qt.

Читали про интернационализацию?