我已经找到了如何在QML文档中显示QWidget(特别是QLabel)的示例:
https://kunalmaemo.blogspot.com/2011/07/how-to-display-qwidget-into-qml.html
问题在于它使用QtQuick 1,并且无法在我的应用程序(使用QtQuick 2)中进行编译。
如何使用QtQuick 2做到这一点?我需要做的就是这个原始示例:在c ++端创建一个QLabel
并将其嵌入到QML文档中。
这是到目前为止我能做的。这与我上面发布的示例类似,除了没有QGraphicsProxyWidget* mProxy;
,因为它没有在QtQuick 2中进行编译,并且我将其设置为QQuickView
,而不是QDeclarativeItem
原因。在c ++方面,我定义了一个名为QmlLabel
的类。
标题:
class QmlLabel : public QQuickView
{
Q_OBJECT
Q_PROPERTY(QString text READ text WRITE setText)
public:
explicit QmlLabel(QQuickView *parent = 0);
~QmlLabel();
public slots:
void setText(const QString& text);
QString text() const;
private:
QLabel* mLabel;
};
实施:
QmlLabel::QmlLabel(QQuickView *parent) :
QQuickView(parent)
{
mLabel = new QLabel(QString(""));
mLabel->setText("Your mother sews socks");
mLabel->setStyleSheet("QLabel { background-color : red; color :
blue; white-space : pre-wrap; }");
}
QmlLabel::~QmlLabel()
{
delete mLabel;
}
void QmlLabel::setText(const QString& text)
{
mLabel->setText(text);
}
QString QmlLabel::text() const
{
return mLabel->text();
}
我正在为此类调用qmlRegisterType
,这使我可以在QML文件中声明类型为QmlLabel
的对象,如下所示:
QmlLabel {
id: whatever
height: 50
width: 200
}
所有内容都可以编译,构建和运行,但是QmlLabel根本不可见。显然,构造函数中没有任何代码可将创建的QLabel
实际添加到任何内容,因此即使成功创建了标签,也不会将其添加到任何内容中而看不到它。原始示例中的这一行:
mProxy = new QGraphicsProxyWidget(this);
mProxy->setWidget(mLabel);
...大概是标签出现的原因,但是如果没有QGraphicsProxyWidget将其添加到标签中,我将无法调用它。
那我该如何做呢?