首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将QClipboard传递给QML

将QClipboard传递给QML
EN

Stack Overflow用户
提问于 2016-10-17 17:31:02
回答 2查看 3.1K关注 0票数 8

我试图使剪贴板对某些QML代码可用。

传递剪贴板对象似乎有效,但是我不能调用它的方法。

下面是一个QClipboard在C++中工作良好的示例,传递给QML,而在调试输出中,它仍然是一个QClipboard对象,但失去了它的功能。

main.cpp

代码语言:javascript
复制
#include <QApplication>
#include <QClipboard>
#include <QQmlApplicationEngine>
#include <qqmlcontext.h>
#include <QtQml>


int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    QQmlApplicationEngine engine;
    engine.rootContext()->setContextProperty("clipboard", QApplication::clipboard());
    qDebug() << QApplication::clipboard()->text(); // This correctly prints the copied text
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
    return app.exec();
}

main.qml

代码语言:javascript
复制
import QtQuick 2.5
import QtQuick.Controls 1.3
ApplicationWindow {
    visible: true
    MouseArea {
        acceptedButtons: Qt.MiddleButton
        anchors.fill: parent
        onClicked: {
            console.log(clipboard)
            console.log(clipboard.getText())
        }
    }
}

qml.qrc

代码语言:javascript
复制
<RCC>
    <qresource prefix="/">
        <file>main.qml</file>
    </qresource>
</RCC>

test.pro

代码语言:javascript
复制
TEMPLATE = app
VERSION = 1.0

QT += qml widgets gui
QMAKE_LFLAGS += -Wl,--as-needed

SOURCES += main.cpp
RESOURCES += qml.qrc
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-17 18:02:29

如果您想从QML调用它们,QObject的函数需要是槽。QClipboard声明没有插槽,所以不能直接调用它的函数。不过,您可以创建一个代理:

qclipboardproxy.hpp

代码语言:javascript
复制
#ifndef QCLIPBOARDPROXY_HPP
#define QCLIPBOARDPROXY_HPP

#include <QObject>

class QClipboard;

class QClipboardProxy : public QObject
{
    Q_OBJECT
    Q_PROPERTY(QString text READ text NOTIFY textChanged)
public:
    explicit QClipboardProxy(QClipboard*);

    QString text() const;

signals:
    void textChanged();

private:
    QClipboard* clipboard;
};

#endif // QCLIPBOARDPROXY_HPP

qclipboardproxy.cpp

代码语言:javascript
复制
#include "qclipboardproxy.hpp"

#include <QClipboard>

QClipboardProxy::QClipboardProxy(QClipboard* c) : clipboard(c)
{
    connect(c, &QClipboard::dataChanged, this, QClipboardProxy::textChanged)
}

QString QClipboardProxy::text()
{
    return clipboard->text();
}

和在

main.cpp

代码语言:javascript
复制
engine.rootContext()->setContextProperty("clipboard",
    new QClipboardProxy(QGuiApplication::clipboard()));

现在你可以打电话:

代码语言:javascript
复制
console.log(clipboard.text)

甚至是

代码语言:javascript
复制
someProperty: clipboard.text
票数 12
EN

Stack Overflow用户

发布于 2016-10-17 18:28:17

受@krzaq解决方案的启发,您甚至可以将代理变成可实例化的QML类型。

代码语言:javascript
复制
class ClipboardProxy : public QObject
{
    Q_OBJECT
    Q_PROPERTY(QString text READ dataText WRITE setDataText NOTIFY dataChanged)
    Q_PROPERTY(QString selectionText READ selectionText WRITE setSelectionText NOTIFY selectionChanged)
public:
    explicit ClipboardProxy(QObject *parent = 0);

    void setDataText(const QString &text);
    QString dataText() const;

    void setSelectionText(const QString &text);
    QString selectionText() const;

signals:
    void dataChanged();
    void selectionChanged();
};

ClipboardProxy::ClipboardProxy(QObject *parent)
    : QObject(parent)
{
    QClipboard *clipboard = QGuiApplication::clipboard();
    connect(clipboard, &QClipboard::dataChanged,
            this, ClipboardProxy::dataChanged);
    connect(clipboard, &QClipboard::selectionChanged,
            this, ClipboardProxy::selectionChanged);
}

void ClipboardProxy::setDataText(const QString &text)
{
    QGuiApplication::clipboard()->setText(text, QClipboard::Clipboard);
}

QString ClipboardProxy::dataText() const
{
    return QGuiApplication::clipboard()->text(QClipboard::Clipboard);
}

void ClipboardProxy::setSelectionText(const QString &text)
{
    QGuiApplication::clipboard()->setText(text, QClipboard::Selection);
}

QString ClipboardProxy::selectionText() const
{
    return QGuiApplication::clipboard()->text(QClipboard::Selection);
}

main()中注册为类型

代码语言:javascript
复制
qmlRegisterType<ClipboardProxy>("Clipboard", 1, 0, "Clipboard");

在QML中用作类型

代码语言:javascript
复制
import QtQuick 2.4
import Clipboard 1.0

Column {
    Clipboard {
        id: clipboard

        onDataChanged: console.log("Clipboard data changed");
        onSelectionChanged: console.log("Clipboard selection changed");
    }
    Text {
        text: clipboard.text
    }
    TextInput {
        onEditingFinished: clipboard.text = text;
    }
}
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40092352

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档