Заполнитель имени приложения Qt

В Qt 4.8.6 есть механизм для отображения значения QCoreApplication::applicationName() в графическом интерфейсе без программирования? Я имею в виду, есть ли набор заполнителей, которые могут быть использованы в QWidget::windowTitle(), QLabel::text() и другие свойства, которые будут заменены некоторыми общими строками, такими как имя приложения или версия? Что-то вроде [*] заполнитель в QWidget::windowTitle().

1

Решение

Нет, не существует механизма для этого. К счастью, вы можете реализовать свои собственные.

Чтобы заменить текст в элементах управления, вы можете использовать прокси-стиль, который заменяет все вхождения «макросов», которые вы укажете.

Чтобы заменить текст в заголовках окон, вы должны перехватить QEvent::WindowTitleChange,

Чтобы сделать такие макросы уникальными, вы должны обернуть их контрольные коды: здесь, США / РС. Полный пример приведен ниже.

// https://github.com/KubaO/stackoverflown/tree/master/questions/text-wildcard-40235510
#include <QtWidgets>

constexpr auto US = QChar{0x1F};
constexpr auto RS = QChar{0x1E};

class SubstitutingStyle : public QProxyStyle
{
Q_OBJECT
QMap<QString, QString> substs;
public:
static QString _(QString str) {
str.prepend(US);
str.append(RS);
return str;
}
void add(const QString & from, const QString & to) {
substs.insert(_(from), to);
}
QString substituted(QString text) const {
for (auto it = substs.begin(); it != substs.end(); ++it)
text.replace(it.key(), it.value());
return text;
}
virtual void drawItemText(
QPainter * painter, const QRect & rect, int flags, const QPalette & pal,
bool enabled, const QString & text, QPalette::ColorRole textRole = QPalette::NoRole) const override;
};

void SubstitutingStyle::drawItemText(
QPainter * painter, const QRect & rect, int flags, const QPalette & pal,
bool enabled, const QString & text, QPalette::ColorRole textRole) const
{
QProxyStyle::drawItemText(painter, rect, flags, pal, enabled, substituted(text), textRole);
}

template <typename Base> class SubstitutingApp : public Base {
public:
using Base::Base;
bool notify(QObject * obj, QEvent * ev) override {
if (ev->type() == QEvent::WindowTitleChange) {
auto w = qobject_cast<QWidget*>(obj);
auto s = qobject_cast<SubstitutingStyle*>(this->style());
if (w && s) w->setWindowTitle(s->substituted(w->windowTitle()));
}
return Base::notify(obj, ev);
}
};

int main(int argc, char ** argv) {
SubstitutingApp<QApplication> app{argc, argv};
auto style = new SubstitutingStyle;
app.setApplicationVersion("0.0.1");
app.setStyle(style);
style->add("version", app.applicationVersion());

QLabel label{"My Version is: \x1Fversion\x1E"};
label.setWindowTitle("Foo \x1Fversion\x1E");
label.setMinimumSize(200, 100);
label.show();
return app.exec();
}
#include "main.moc"

Смотрите также: контроль над текстом.

2

Другие решения

Если я правильно понимаю ваш вопрос, то qtTrId должен помочь тебе. Это не подстановочные, но вы можете выбрать любой ID ты хочешь.

Подробности:

Несколько изменений должны быть применены к этот пример.

  1. использование qtTrId с IDs вместо tr, лайк:

    QPushButton hello (qtTrId («applicationNameId»));

  2. На пятом шаге Вот, ты должен положить -idbased параметр к lrelease инструмент.

    lrelease -idbased hellotr_la.ts

примечание: hellotr_la.ts был создан с использованием lupdate на первом этапе Вот

1

По вопросам рекламы [email protected]