Ответ находится в 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
Относительно как отключить это поведение по умолчанию :
Я посмотрел на 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();
//...
}
, который я попробовал в моем образце.
Наконец, ни один из них не достиг желаемого эффекта, то есть только "&&"
было отображено как &
, но "&"
никогда.
__