Как отключить специальную обработку ярлыков кнопок & на Qt? - PullRequest
0 голосов
/ 11 сентября 2018

Я унаследовал систему виртуальной клавиатуры с массивом кнопок, по одной для каждой клавиши.Ярлык для каждой кнопки - один QChar.При отображении клавиатуры «символы» код использует «&» QChar для метки клавиши, но клавиша отображается пустой.Я уверен, что Qt обрабатывает '&' как префикс сочетания клавиш.Точно так же введенный текст отображается на другой, более длинной метке кнопки;этот ярлык также обрабатывает символ '&' как ускоритель.Ввод «ABC & DEF» отображается как «ABCDEF» с подчеркнутым «D».

Я пробовал строить с QT_NO_SHORTCUT #defined, но это не имело никакого значения.

Кто-нибудь знает опростой способ отключить эту специальную обработку '&'?

1 Ответ

0 голосов
/ 11 сентября 2018

Ответ находится в Qt doc. QAbstractButton::text * * 1004

Если текст содержит символ амперсанда ('&'), для него автоматически создается ярлык. Символ, который следует за «&», будет использоваться в качестве сочетания клавиш. Любой предыдущий ярлык будет перезаписан или очищен, если ярлык не определен текстом. Подробности смотрите в документации по QShortcut. Чтобы отобразить фактический амперсанд, используйте '&&' .

(Подчеркну, мною.)

QPushButton является производным от QAbstractButton, унаследовавшего это поведение.

Образец testQPushButtonAmp.cc:

#include <QtWidgets>

int main(int argc, char **argv)
{
  qDebug() << "Qt Version:" << QT_VERSION_STR;
  QApplication app(argc, argv);
  QPushButton qBtn("Text with &&");
  qBtn.show();
  return app.exec();
}

testQPushButtonAmp.pro:

SOURCES = testQPushButtonAmp.cc

QT = widgets

Скомпилировано и протестировано на cygwin64 на Windows 10:

$ qmake-qt5 testQPushButtonAmp.pro

$ make

$ ./testQPushButtonAmp
Qt Version: 5.9.4

snapshot of testQPushButtonAmp


Относительно как отключить это поведение по умолчанию :

Я посмотрел на woboq.org QAbstractButton::setText().

void QAbstractButton::setText(const QString &text)
{
    Q_D(QAbstractButton);
    if (d->text == text)
        return;
    d->text = text;
#ifndef QT_NO_SHORTCUT
    QKeySequence newMnemonic = QKeySequence::mnemonic(text);
    setShortcut(newMnemonic);
#endif
    d->sizeHint = QSize();
    update();
    updateGeometry();
#ifndef QT_NO_ACCESSIBILITY
    QAccessibleEvent event(this, QAccessible::NameChanged);
    QAccessible::updateAccessibility(&event);
#endif
}

Итак, QT_NO_SHORTCUT отключает извлечение ярлыка из текста , но он должен быть определен при сборке библиотеки Qt из исходного кода. На самом деле, я боюсь, что даже при отключенных ярлыках сингл & все равно станет невидимым в выводе.

Я углубился в woboq.org и нашел несколько многообещающих кандидатов, например ::1010*

qt_set_sequence_auto_menmonic()

Указывает, следует ли учитывать мнемонику для пунктов меню, надписей и т. Д. В Windows и X11 эта функция включена по умолчанию; macOS , он выключен. Когда эта функция отключена (то есть когда b имеет значение false), QKeySequence :: mnemonic () всегда возвращает пустую строку.

Примечание: Эта функция не объявлена ​​ни в одном из заголовочных файлов Qt. Чтобы использовать его в своем приложении, объявите прототип функции перед вызовом.

и образец в QProxyStyle

#include "textedit.h"
#include <QApplication>
#include <QProxyStyle>

class MyProxyStyle : public QProxyStyle
{
  public:
    int styleHint(StyleHint hint, const QStyleOption *option = 0,
                  const QWidget *widget = 0, QStyleHintReturn *returnData = 0) const override
    {
        if (hint == QStyle::SH_UnderlineShortcut)
            return 0;
        return QProxyStyle::styleHint(hint, option, widget, returnData);
    }
};

int main(int argc, char **argv)
{
    Q_INIT_RESOURCE(textedit);

    QApplication a(argc, argv);
    a.setStyle(new MyProxyStyle);
    TextEdit mw;
    mw.resize(700, 800);
    mw.show();
    //...
}

, который я попробовал в моем образце.

Наконец, ни один из них не достиг желаемого эффекта, то есть только "&&" было отображено как &, но "&" никогда.

__

...