Как отобразить верхний индекс в элементе QComboBox?

Я хочу отобразить 10-8 в элементе QComboBox. Но он отображает теги «sup».


person Alen    schedule 16.03.2014    source источник
comment
Вы пробовали <sup>-8</sup>? Не уверен, что он поддерживает html, но, основываясь на том, что делает QLabel, я надеюсь на это.   -  person lpapp    schedule 16.03.2014
comment
Да, работает с qlabel, но не с qcombobox   -  person Alen    schedule 16.03.2014


Ответы (3)


проще всего использовать специальные символы Юникода и использовать их в файле перевода (прямое использование в коде может быть проблематичным):

10⁻⁸

Если вам не нравится использовать файл перевода, попробуйте этот код:

ui->comboBox->addItem(QString::fromWCharArray(L"10\x207B\x2078"));
ui->comboBox->addItem(QString::fromWCharArray(L"10⁻⁸"));

На моем Qt.5.2.1 (Linux) работает. Также работает вставка строки выше в дизайнере.

person Marek R    schedule 16.03.2014
comment
да, это не локализуемая строка, но ничто не запрещает использовать дополнительный файл перевода, который будет содержать чистые строки Unicode (я предпочитаю это решение, вместо того, чтобы иметь некоторые проблемы с кодировкой файла исходного кода). - person Marek R; 16.03.2014
comment
Насколько я понимаю, проблема ОП в том, что это не работает, даже если редактор правильно настроен для кодировки. - person lpapp; 16.03.2014
comment
да, но он пытался использовать html-теги, я рекомендую использовать символы Unicode, которые находятся в надстрочном индексе без каких-либо тегов. Если вам не нравится файл перевода, есть другие способы добиться этих символов (например, вставить в дизайнере). - person Marek R; 16.03.2014
comment
Нет, ОП сначала пробовал буквы юникода, а потом теги. Это просто. Попробуйте себя. :-) Либо вы можете настроить редактор на кодировку юникода (или прочитать его с помощью QTextStream с правильным набором кодировки, но это очень сложно), либо вам нужен форматированный текст. - person lpapp; 16.03.2014
comment
Вы видимо не поняли моего ответа. - person Marek R; 16.03.2014
comment
С этим дополнением снимаю -1 за маскировку файла перевода, спасибо. :-) Кстати, я полностью понял ваш ответ, мне просто не нравятся взломы файлов перевода, как в вашем исходном ответе. - person lpapp; 16.03.2014
comment
@LaszloPapp Я нашел это, поэтому использование tr для таких случаев даже рекомендуется Документация Qt. - person Marek R; 20.03.2014
comment
Как написано в предложении, это для множественного числа, а не в данном случае. - person lpapp; 20.03.2014

Не существует простого способа добиться этого. Лучший способ — переопределить стиль QComboBox с помощью класса QProxyStyle. Затем вы можете нарисовать текст поля со списком, используя QTextDocument или аналогичный.

http://qt-project.org/doc/qt-5.0/qtwidgets/qproxystyle.html

В частности, QComboBox использует

void QComboBox::paintEvent(QPaintEvent *)
{
    QStylePainter painter(this);
    ....
    // draw the icon and text
    painter.drawControl(QStyle::CE_ComboBoxLabel, opt);
}

и оттуда вы можете найти, как это делается из qtbase/src/widgets/styles/qcommonstyle.cpp. Переопределения для рисования пользовательского текста вместо основного текста должны быть очевидны, по крайней мере, для QComboBox только для чтения.

Если вам нужно отредактировать что-то в строке редактирования QComboBox, вам нужно будет переопределить этот QLineEdit своим собственным.

QComboBox::itemDelegate() переопределяет только отрисовку всплывающего списка, как указано в документации. Он не переопределяет отображение текста поля редактирования и, следовательно, не может использоваться для полного решения вашей проблемы.

person user3427419    schedule 17.03.2014

Вы не можете сделать это легко, например. с html, потому что QComboBox, похоже, не поддерживает форматированный текст, как некоторые другие подклассы QWidget.

Однако вы можете заменить делегата по умолчанию на рисование по своему усмотрению, включая это. Вам нужно будет установить делегат вашего элемента для QComboBox и использовать QTextDocument в вашем методе рисования.

Вот соответствующий отчет об ошибке, который был отправлен некоторое время назад:

Расширенный текст в элементах поля со списком

В качестве альтернативы вы можете дважды проверить кодировку. Это может быть просто проблема с обработкой юникода. Если оба работают на вас, то вам решать, как с этим справиться.

Основываясь на потоке следующего потока, вы можете попробовать это метод QString.

person lpapp    schedule 16.03.2014
comment
@ user3330612: что нельзя? - person lpapp; 16.03.2014
comment
@Alen: ах, да, есть некоторые ограничения на минимальное количество вводимых символов. Это будет немного больше работы, чем вы ожидали, поскольку для этого нет поддержки, но, по крайней мере, это будет работать. - person lpapp; 16.03.2014
comment
@Alen обычный способ сказать спасибо в SO - это проголосовать ... :-) И как спрашивающий, у вас также есть возможность принять один ответ, чтобы указать, что он решил вашу проблему (но это хорошая идея подождать несколько дней на случай, если дано больше хороших ответов). - person hyde; 16.03.2014