Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > [Qt] Создаю контекстное меню. Не пашут Shortcut'ы


Автор: EKoshelev 26.5.2015, 10:03
В ассистанте для добавления опции в контекстное меню кроме прочего есть такой метод:

Код

QAction * QMenu::addAction ( const QString & text, const QObject * receiver, const char * member, const QKeySequence & shortcut = 0 )


Пишу такой код:

Код

    QKeySequence* pCtrlN = new QKeySequence("Ctrl+N");

    // Меню, выпадающее на ListWidget'ах
    m_pMenu = new QMenu();
    QAction* pInsAction = m_pMenu->addAction(toUnicode("&Вставить"), this, SLOT(insertAction())/*, QKeySequence("Ins")*/);
    m_pMenu->addAction(toUnicode("&Добавить"), this, SLOT(addAction()), Qt::CTRL + Qt::Key_N);
    m_pMenu->addAction(toUnicode("&Удалить"), this, SLOT(deleteAction()));
    m_pMenu->addSeparator();
    m_pMenu->addAction(toUnicode("&Копировать"), this, SLOT(copyAction()), QKeySequence("Ctrl+C"));
    m_pMenu->addAction(toUnicode("&Вставить"), this, SLOT(pasteAction()), *(new QKeySequence("Ctrl+V")));

    pInsAction->setShortcut(Qt::Key_Insert);


Т. е. пытаюсь задать горячую клавишу четырьмя способами. Менюха показывается и правильно работает, а горячие клавиши - нет.

Подскажите что я делаю не правильно.

Автор: Guinness 26.5.2015, 11:57
Возможно, идея идиотская, но я бы попробовал. Попробуйте убрать знак амперсанда перед названиями QAction. Если не прокатит, то нужно пробовать нажимать shorcut'ы при различных фокусах элементов. К примеру нажать по главному окну, понажимать shorcut'ы, нажать на элемент ListView, повторить процедуру.

Добавлено через 4 минуты и 37 секунд
И ещё выведите в консоль или куда-нибудь список http://doc.qt.io/qt-5/qaction.html#shortcuts, чтобы точно убедиться, что они присвоились QAction'ам.

Автор: EKoshelev 26.5.2015, 14:13
Guinness, амперсанды убрал, фокусы менял, шоткаты присваиваются. Но нифига не пашет. 

Увы, блин...

Автор: Guinness 26.5.2015, 15:50
EKoshelev, порылся у себя в коде. Работают вот такие назначения:
Код

    m_ui->actionOpen->setShortcut(QKeySequence( QKeySequence::Open ) );
    m_ui->actionSave->setShortcut(QKeySequence( QKeySequence::Save ) );
    m_ui->actionAbout->setShortcut(QKeySequence( QKeySequence::HelpContents ) );

Остальное назначал через QtDesigner. Он делает так:
Код

        actionExit->setText(QApplication::translate("TaskSchedule", "\320\222\321\213\321\205\320\276\320\264", 0));
        actionExit->setShortcut(QApplication::translate("TaskSchedule", "Ctrl+Q", 0));

К несчастью, сейчас пробовать Ваш код времени нет, но я надеюсь что-то из приведенного мной натолкнёт Вас на решение проблемы.

Автор: Guinness 27.5.2015, 08:57
Я что подумал, а Вы где тестируете своё приложение? Пробовали отлаживать на чистой ОС на виртуалке?

Автор: EKoshelev 27.5.2015, 10:33
Цитата

Я что подумал, а Вы где тестируете своё приложение? Пробовали отлаживать на чистой ОС на виртуалке? 

Тестирую в седьмой винде. Что такое виртуалка, признаться, не в курсе.


Короче, у меня ничего не получилось. Сделал по тупому, вот так:

Код

    m_pMenu = new QMenu();
    m_pMenu->addAction(toUnicode("&Добавить строку"), this, SLOT(addAction()), Qt::CTRL + Qt::Key_N);
    m_pMenu->addAction(toUnicode("&Удалить строку"), this, SLOT(deleteAction()));
    m_pMenu->addAction(toUnicode("&Вставить строку"), this, SLOT(insertAction()), Qt::Key_Insert);
    m_pMenu->addSeparator();
    m_pMenu->addAction(toUnicode("&Копировать"), this, SLOT(copyAction()), Qt::CTRL + Qt::Key_C);
    m_pMenu->addAction(toUnicode("&Вставить"), this, SLOT(pasteAction()), Qt::CTRL + Qt::Key_V);
    // Горячие клавиши
    QShortcut* pAddSortcut = new QShortcut(Qt::CTRL + Qt::Key_N, this, SLOT(addAction()));
    QShortcut* pInsSortcut = new QShortcut(Qt::Key_Insert, this, SLOT(insertAction()));
    QShortcut* pCopySortcut = new QShortcut(Qt::CTRL + Qt::Key_C, this, SLOT(copyAction()));
    QShortcut* pPasteSortcut = new QShortcut(Qt::CTRL + Qt::Key_V, this, SLOT(pasteAction()));


Автор: Guinness 27.5.2015, 13:35
Цитата(EKoshelev @  27.5.2015,  11:33 Найти цитируемый пост)
Что такое виртуалка, признаться, не в курсе.

http://www.vmware.com/ru, https://www.virtualbox.org/, например. Я подумал, что возможно проблемы в настройках ОС.

Хотелось бы ещё раз уточнить, вот так, оно не взлетает?
Код

m_pMenu->addAction("title", this, SLOT(addAction()), Qt::CTRL + Qt::Key_N);

Я почему спрашиваю, раньше вроде было так, если пишешь "&Copy", то автоматически горячей клавишей для этого пункта меню Ctrl+C.
Ещё можно попробовать сделать через такой http://doc.qt.io/qt-5/qmenu.html#addAction-5. При этом попробовать создать QAction и вручную ему добавить http://doc.qt.io/qt-5/qaction.html#shortcut-prop и попробовать поиграться с его http://doc.qt.io/qt-5/qt.html#ShortcutContext-enum.
Но, вообще, у меня варианты как-то закончились, потому что это всегда работало.

Автор: Amp 27.5.2015, 13:56
Версия Qt какая? У них был ряд багов связанных с работой хоткеев и акселераторов в non-latin раскладке.

Автор: EKoshelev 28.5.2015, 09:07
Guinness, 
Код

VMWare, VirtualBox, например.

Нет, чисто под виндой тестил.

Код

Хотелось бы ещё раз уточнить, вот так, оно не взлетает?

Не взлетает

&Copy - не становится

Код

Я почему спрашиваю, раньше вроде было так, если пишешь "&Copy", то автоматически горячей клавишей для этого пункта меню Ctrl+C.
Ещё можно попробовать сделать через такой addAction. При этом попробовать создать QAction и вручную ему добавить горячую клавишу и попробовать поиграться с его контекстом.

С контекстом не игрался, но остальное не пашет.


Amp, 4.8.5. Не совсем понял что имел в виду про раскладку, но если правильно понял, то и при RU, и при EN раскладках не работает.

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)