Qt 应用程序名称占位符
Qt application name placeholder
在 Qt 4.8.6 中,是否有一种机制来显示 QCoreApplication::applicationName()
in the GUI without programming? I mean, is there a set of placeholders which can be used in QWidget::windowTitle()
, QLabel::text()
and other properties, that would be replaced by some common strings like application name or version? Something like the [*]
placeholder in QWidget::windowTitle()
的值。
如果我对你的问题理解正确,那么qtTrId应该能帮到你。这不是 通配符,但您可以选择任何 ID
。
详情:
应将一些更改应用于 this 示例。
使用 qtTrId
和 IDs
而不是 tr
,例如:
QPushButton 你好(qtTrId("applicationNameId"));
在第五步here中,您应该将-idbased
参数添加到lrelease
工具中。
lrelease -idbased hellotr_la.ts
注意:hellotr_la.ts在第一步中使用lupdate
生成here
不,不存在执行此操作的现有机制。幸运的是,您可以实现自己的。
要替换控件中的文本,您可以使用代理样式来替换您指定的所有出现的 "macros"。
要替换 window 标题中的文本,您必须截取 QEvent::WindowTitleChange
。
要使此类宏独一无二,您应该用一些 control codes 将它们包裹起来:这里是 US/RS。下面是一个完整的示例。
// https://github.com/KubaO/Whosebugn/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"
另请参阅:control text elision。
在 Qt 4.8.6 中,是否有一种机制来显示 QCoreApplication::applicationName()
in the GUI without programming? I mean, is there a set of placeholders which can be used in QWidget::windowTitle()
, QLabel::text()
and other properties, that would be replaced by some common strings like application name or version? Something like the [*]
placeholder in QWidget::windowTitle()
的值。
如果我对你的问题理解正确,那么qtTrId应该能帮到你。这不是 通配符,但您可以选择任何 ID
。
详情:
应将一些更改应用于 this 示例。
使用
qtTrId
和IDs
而不是tr
,例如:QPushButton 你好(qtTrId("applicationNameId"));
在第五步here中,您应该将
-idbased
参数添加到lrelease
工具中。lrelease -idbased hellotr_la.ts
注意:hellotr_la.ts在第一步中使用lupdate
生成here
不,不存在执行此操作的现有机制。幸运的是,您可以实现自己的。
要替换控件中的文本,您可以使用代理样式来替换您指定的所有出现的 "macros"。
要替换 window 标题中的文本,您必须截取 QEvent::WindowTitleChange
。
要使此类宏独一无二,您应该用一些 control codes 将它们包裹起来:这里是 US/RS。下面是一个完整的示例。
// https://github.com/KubaO/Whosebugn/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"
另请参阅:control text elision。