Qt应用程序名称占位符

时间:2016-10-25 08:52:17

标签: c++ qt property-placeholder

在Qt 4.8.6中,有没有一种机制可以在没有编程的情况下在GUI中显示QCoreApplication::applicationName()的值?我的意思是,是否有一组占位符可以在QWidget::windowTitle()QLabel::text()和其他属性中使用,这些属性将被一些常见的字符串替换,如应用程序名称或版本?类似QWidget::windowTitle()中的[*]占位符。

2 个答案:

答案 0 :(得分:2)

不,没有现成的机制可以做到这一点。幸运的是,您可以实现自己的。

要替换控件中的文本,可以使用替换所指定的“宏”的所有出现的代理样式。

要替换窗口标题中的文字,您必须截取QEvent::WindowTitleChange

要使这些宏唯一,你应该用一些control codes包裹它们:这里是US / RS。下面是一个完整的例子。

// 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"

另请参阅:control text elision

答案 1 :(得分:1)

如果我正确理解您的问题,那么qtTrId应该会对您有所帮助。它不是通配符,但您可以选择所需的任何ID

<强>详细信息:

应对this示例进行一些更改。

  1. qtTrIdIDs一起使用,而不是tr,例如:

    QPushButton你好(qtTrId(&#34; applicationNameId&#34;));

  2. 在第五步here中,您应该将-idbased参数添加到lrelease工具中。

    lrelease -idbased hellotr_la.ts

  3. 注意:hellotr_la.ts已在第一步使用lupdate生成here