诺基亚在教程中编写的示例并不是一个纯粹的 QML 程序。它包含 C++ 和 QML。这种程序通常是加载 QML 文件并渲染它的 C++ 程序。C++ 程序通常以一个名为int main(int argc, char *argv[]);
. 在您的情况下,正是这个“main()”函数加载您的 QML 主文件 ( main.qml
) 文件并呈现它。
但是在加载 QML 主文件之前,您必须告诉 QML 系统您将使用一个名为FileIO
. 为此,您必须使用int qmlRegisterType<T>(const char * package, int majorVersion, int minorVersion, char * classNameInQML);
C++ 函数。它需要大约5个参数:
- T:C++ 模板参数。它是您的 C++ 类 (FileIO)。
- 包:所有 QML 类都在包中,它们是版本化的。这是包的名称。
- majorVersion:所有 QML 类都在包中,它们是版本化的。这是软件包的主要版本号。
- minorVersion:所有 QML 类都在包中,它们是版本化的。这是软件包的次要版本号。
- classNameInQML:所有 QML 类都在包中,它们是版本化的。这是您将在 QML 文件中使用的类的名称大多数情况下,该名称与 C++ 类名称相同。
要使用此函数,您必须在编写它的 C++ 文件中包含 C++ 标头:
- 如果您使用 Qt 4,则标题为
<QtDeclarative>
.
- 如果您使用 Qt 5,则标题为
<QtQml>
.
最后你应该有一些这样的东西:
main.cpp(带有 main() C++ 函数的文件):
// C++ header to include for using qmlRegisterType();
#include <QtDeclarative> // If you use Qt4
#include <QtQml> // If you use Qt5
// Some stuff used by the main(); function
#include <QApplication>
#include <QLatin1String>
#include "ui/qtquickapplicationviewer.hpp" // Something which manages your QML files. Qt Creator will generate it for you if you use it to code..
#include "fileio.h" // Your FileIO C++ class
/**
* @fn Q_DECL_EXPORT int main(int argc, char *argv[])
* @brief The C++ main(); function. Your program begins HERE.
*/
Q_DECL_EXPORT int main(int argc, char *argv[])
{
QApplication app(argc, argv);
// ...
// Declaring your C++ class to the QML system
qmlRegisterType<FileIO>("MyCustomClasses", 1, 0, "FileIOQML");
// ...
// Loading your main QML file
QLatin1String mainQMLFile = "./ui/qml/main.qml";
QtQuickApplicationViewer viewer;
viewer.setMainQmlFile(mainQMLFile);
// Showing how beautiful your QML interface is :)
viewer.showExpanded();
// Now let's play with your QML interface is :)
return app.exec();
}
要加载的 main.qml 文件(来自诺基亚教程):
import QtQuick 1.1
import MyCustomClasses 1.0
Rectangle {
width: 360
height: 360
Text {
id: myText
text: "Hello World"
anchors.centerIn: parent
}
FileIOQML {
id: myFile
source: "my_file.txt"
onError: console.log(msg)
}
Component.onCompleted: {
console.log( "WRITE"+ myFile.write("TEST"));
myText.text = myFile.read();
}
}
注意:为了避免混淆,我已经更改了诺基亚教程中的一些“ FileIO ”。