您的位置:首页 > 其它

QML笔记点滴

2011-12-16 20:36 302 查看
QML 的一些小内容:

1. 应用qrc资源中的QML文件

下面这段代码是不会正常工作的,

QmlApplicationViewer viewer;
viewer.setMainQmlFile(QLatin1String(":qml/main.qml"));
因为在 QmlApplicationViewer::setMainQmlFile() 方法中实际执行了代码:

d->view->setSource(QUrl::fromLocalFile(d->mainQmlFile));
fromLocalFile 只能接受一个本地硬盘的文件,正确的写法如下

QmlApplicationViewer viewer;
viewer.setSource(QUrl("qrc:/qml/qml/main.qml"));

这里顺带说明一点,在网上搜到一些文章中使用的时 setSource(QUrl("qrc:qml/main.qml")) 这种写法,但是事实证明这种写法是不正确的,qrc: 这种引用资源的方法应该是在 QML 文件中使用的,在 C++ 只需要冒号就可以了,加上 qrc 前缀反而找不到了。

我要收回这句话,今天发现还是自己的代码错了 —— 我将 main.qml 文件放到了qrc文件里一个名为 /qml 的prefix下面,因此引用 main.qml 应该写prefix加文件路径,即「 qrc:/qml/qml/main.qml 」,前一个 qml 是在 qrc 文件中设定的 prefix,后一个 qml 是放置 main.qml 的路径的一部分。而「:qml/main.qml」这个可以用,完全是因为
Qt 还是到本地的 qml 目录下面去找到了 main.qml 文件,而不是资源里面的那个



专门研究了一下关于应用资源时的 qrc 前缀问题,Qt 文档里对这个问题只字未提,这里补充上:

在C++中引用资源加不加 qrc: 前缀实际上跟引用资源的方法有关,如果在引用资源时使用了 QUrl 这个类,则必须在资源文件的路径前面加上「 qrc:」 ,否则,QUrl 只会到本地目录去搜索。例如:

viewer.setSource(QUrl("qrc:/qml/qml/main.qml"));


相反,如果没有使用 QUrl 这个类,则不能使用
「qrc:」,而必须用「 :」,否则同样会找不到文件!例如:

label->setPixmap(QPixmap(":/img/1.jpg"));


参考:

http://developer.qt.nokia.com/forums/viewthread/1517

2. 在 QML 中访问资源

在 QML 中访问 qrc 中的资源可以使用 qrc:/ 加资源在qrc文件中的完整路径,如果 QML 文件本身就在 qrc 资源文件中,还可以使用 qrc: (没有斜杠)加资源相对当前 QML 文件的路径来获取。

例如:

Image {
    source: "qrc:/qml/images/title.png"
}


假如当前 QML 文件位于资源中,并且位置为 qrc:/qml/main.qml ,那么下面这段代码和上面的等效:

Image {
    source: "qrc:images/title.png"
}


3. 使用滑动条控件 ScrollDecorator

只需要设置 ScrollDecorator 的 flickableItem 属性为一个 Flickable 控件就可以了,但是需要注意:

所使用的 Flickable 必须设定 contentHeight 属性,并且这个属性的值必须大于屏幕高度(哪怕是screenHeight + 1都可以),否则就不会有滑动条和到边界反弹的效果。

4. 基本的QML类型,能够在 property 中使用的数据类型包括:

int
bool
double
real
string
url
color
date
variant

没有 list 类型,所以在 QML 组件间,不能够直接用属性传递字符串数组这样的内容,

如果必须的话可以使用一个JS文件定义文件,在两个 QML 中都 import 这个JS文件来传递内容,但是这样相当于全局变量而不是组件的内部属性,依然有局限性。

也许是因为C++的思维惯性,在使用 QML 的时候总很有一种很闷骚很不爽的感觉,控件的属性值不能直接用 JS,LineEdit(QML 称为 TextInput) 只有 onAccepted 一个信号,明明很简单的一个逻辑它就是做不了,有时候不得不写一堆 Hard code ..
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: