【问题标题】:Access to system icons in QT / QML访问 QT / QML 中的系统图标
【发布时间】:2021-05-24 09:41:40
【问题描述】:

在为 iOS 开发原生应用时,iOS SDK 具有以下功能:

[[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd ...] autorelease];

那些是本机图标 OS 图标,还有 several of them。我还没有开发任何安卓应用,但我猜安卓 SDK 提供了类似的功能。

现在的问题是,在使用 QT 开发跨平台应用程序时,是否可以引用 QT/QML 中的那些原生系统图标?

使用那些标准的系统图标来保留应用程序的原生感觉真的很棒,而不是为标准用例提供自定义应用程序图标。

【问题讨论】:

  • 不确定,但我想您可能正在寻找QStyle::standardIcon
  • 如何在 QML 中使用它们?
  • 对不起,我不使用 QML。也许其他人可以发表评论。你可能想看看this post

标签: android ios qt qml icons


【解决方案1】:

跟进 G.M. 的评论,我使用了 QQuickImageProvider,不知道这是否适用于 Android。不幸的是,它使用QApplication 而不是QGuiApplication,否则无法通过style() 获得QStyle。因此需要将widgets 添加为库。

ma​​in.cpp

#include <QApplication>
#include <QQmlApplicationEngine>
#include <QQuickImageProvider>
#include <QStyle>

class StandardIconProvider : public QQuickImageProvider
{
public:
    StandardIconProvider(QStyle *style)
        : QQuickImageProvider(Pixmap)
        , m_style(style)
    {}

    QPixmap requestPixmap(const QString &id, QSize *size, const QSize &requestedSize) override
    {
        Q_UNUSED(size)
        static const auto metaobject = QMetaEnum::fromType<QStyle::StandardPixmap>();
        const int value = metaobject.keyToValue(id.toLatin1());
        QIcon icon = m_style->standardIcon(static_cast<QStyle::StandardPixmap>(value));
        return icon.pixmap(requestedSize);
    }

    QStyle *m_style;
};

int main(int argc, char *argv[])
{
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
#endif

    QApplication app(argc, argv);

    QQmlApplicationEngine engine;
    engine.addImageProvider(QLatin1String("standardicons"), new StandardIconProvider(app.style()));

    const QUrl url(QStringLiteral("qrc:/main.qml"));
    QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,
                     &app, [url](QObject *obj, const QUrl &objUrl) {
        if (!obj && url == objUrl)
            QCoreApplication::exit(-1);
    }, Qt::QueuedConnection);
    engine.load(url);

    return app.exec();
}

ma​​in.qml

import QtQuick 2.15
import QtQuick.Window 2.15

Window {
    width: 640
    height: 480
    visible: true
    title: qsTr("Standard Icon Provider demo")

    component Icon: Image {
        width: 64
        height: 64
        sourceSize: Qt.size(64, 64)
    }

    Grid {
        columns: 3
        rows: 3
        spacing: 10
        anchors.centerIn: parent

        Icon { source: "image://standardicons/SP_TrashIcon" }
        Icon { source: "image://standardicons/SP_MessageBoxCritical" }
        Icon { source: "image://standardicons/SP_DirHomeIcon" }
        Icon { source: "image://standardicons/SP_DirClosedIcon" }
        Icon { source: "image://standardicons/SP_ArrowUp" }
        Icon { source: "image://standardicons/SP_DialogHelpButton" }
        Icon { source: "image://standardicons/SP_BrowserStop" }
        Icon { source: "image://standardicons/SP_FileLinkIcon" }
        Icon { source: "image://standardicons/SP_DialogSaveButton" }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 2021-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多