Q1:我对qml,quick1.0和quick2.0感到困惑.它们之间有什么区别.
我使用基于qt 5.1.1的qt creator 2.8.1.我想开发一个桌面程序,我应该使用哪种技术?
Q2:如何将数据导出到快速程序?我只找到关于qml的文档v 4.7.
我一直在努力学习QtQuick用于GUI创建,但我一直很难理解如何从我的测试程序的C++部分与QML对象进行交互.
这是我简单的QML文件:
import QtQuick 2.2
import QtQuick.Window 2.1
Window {
id: mainWindow
visible: true
width: 800
height: 800
color: "#FFFF0000"
MouseArea {
anchors.fill: parent
onClicked: Qt.quit()
}
Rectangle {
id: testRect
width: 100
height: 100
anchors.centerIn: parent
color: "#FF0000FF"
}
}
Run Code Online (Sandbox Code Playgroud)
这是随附的基本C++文件(由QtCreator自动生成):
#include <QGuiApplication>
#include <QQmlApplicationEngine>
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
QQmlApplicationEngine engine;
engine.load(QUrl(QStringLiteral("qrc:///main.qml")));
return app.exec();
}
Run Code Online (Sandbox Code Playgroud)
我的问题是我不知道如何访问我的'Window'QML对象,因此,我无法改变它的任何属性或其子项的属性!QtQuick文档的这一部分显示了从C++代码中访问QML对象的两种方法,但它们似乎都不适用于这个'QQmlApplicationEngine'加载方案.我也看到人们使用'QApplicationViewer'和'QDeclaritiveView'之类的东西,但我似乎无法在官方文档中找到那些..
我对QtQuick感到非常沮丧; QML的"简单性"似乎在大量冲突的文档和C++与QML之间错综复杂的界面中丢失.无论如何我在使用QQmlApplicationEngine方法时访问我的QML对象?我尝试过使用'QuickView',但它似乎不适用于Window QML对象..?QQmlApplicationEngine仅对单个文件中的QML应用程序有用吗?到目前为止,我读过的每一篇文档和教程都显示了不同的东西......
任何帮助或澄清将不胜感激.理想情况下,我想知道如何通过我的C++代码访问和修改QML对象(如'mainWindow','testRect'和其他文件中的其他对象).
class StyleClass : public QObject {
public:
typedef enum
{
STYLE_RADIAL,
STYLE_ENVELOPE,
STYLE_FILLED
} Style;
Style m_style;
//...
};
Run Code Online (Sandbox Code Playgroud)
.h文件包含上面的代码.如何通过QML访问上面的枚举?
令我惊讶的是,该Image
组件没有radius
属性.我尝试通过将图像放在圆形中来模拟圆角Rectangle
,但它不会剪切角落.
Rectangle {
anchors.right: rectContentBg.left
anchors.top: rectContentBg.top
anchors.margins: 8
radius: 8
width: 64
height: 64
Image {
id: imgAuthor
opacity: 1
smooth: false
anchors.fill: parent
source: "qrc:/res/sample_avatar.jpg"
}
}
Run Code Online (Sandbox Code Playgroud)
如何正确创建圆角图像?
有没有办法在QML和Qt 5.1中列出所有对象成员/属性?
如:
var obj=myQObject;
console.log(obj)
// expected output:
// obj { x:123..... }
Run Code Online (Sandbox Code Playgroud)
这对调试非常有帮助.
如果我在C++中有一个列表,我该如何将它暴露给QML(在Qt5/QtQuick 2中)?似乎QML只能理解 - QObject
派生类,这是一个问题,因为QObject
s不能放入QList
或复制.我该怎么做呢:
struct Thing
{
int size;
QString name;
};
class ThingManager : public QObject
{
Q_OBJECT
// These macros support QtQuick, in case we one day want to use it to make a slick
// interface (when QML desktop components are released).
Q_PROPERTY(QList<Thing> things READ things NOTIFY thingssChanged)
public:
// ...
QList<Thing> things() const;
// ...
};
Run Code Online (Sandbox Code Playgroud)
所以我可以在QML中做这样的事情:?
var a = thingManager.things[0].name;
Run Code Online (Sandbox Code Playgroud) 我想在QML中实现以下场景.
这是ListView
元素的示例/简化委托:
Component {
Item {
id: container
MouseArea {
anchors.fill: parent
hoverEnabled: true
onClicked: {
container.ListView.view.currentIndex = index
container.forceActiveFocus();
}
onEntered: {
actionList.state = "SHOW";
myItem.state = "HOVER"
}
onExited: {
actionList.state = "HIDE";
myItem.state = "NORMAL"
}
Rectangle {
id: myItem
color: "gray"
anchors.fill: parent
Row {
id: actionList
spacing: 5; anchors.fill: parent
Image {
id: helpAction
source: "" //Some image address
width: 16; height: 16; fillMode: Image.PreserveAspectFit
states: [
State {
name: "NORMAL"
PropertyChanges { …
Run Code Online (Sandbox Code Playgroud) 我通过Linux Mint 18(x86_64)上的软件管理器安装了Qt Creator .我做了一些示例项目,以及一些依赖项/ packages/libraries /缺少的东西,所以我安装了via apt.我做了一个QtQuick应用程序,在问题中有一条错误消息说:
error: Unknown module(s) in QT: qml quick
Run Code Online (Sandbox Code Playgroud)
我读到有一些库可以构建和链接,但我不知道在哪里可以找到它们.
我使用QQmlApplicationEngine
如下:
QGuiApplication app(argc, argv);
QQmlApplicationEngine engine;
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
app.exec();
Run Code Online (Sandbox Code Playgroud)
但现在我想为我的应用程序启用多重采样,并且QQmlApplicationEngine
似乎没有setFormat
启用多重采样的方法.
我QQmlApplicationEngine
在论坛中找到了一种方法:
QQuickWindow* window = (QQuickWindow*) engine.rootObjects().first();
QSurfaceFormat format;
format.setSamples(16);
window->setFormat(format)
Run Code Online (Sandbox Code Playgroud)
但它依赖于引擎的第一个根对象是a QQuickWindow
,这在Qt docs中没有记录.所以我不想使用那种技术.
另一种方法是跳过QQmlApplicationEngine
并创建一个QQuickView
代替.这确实有一个setFormat
让我能多采样方法,但我不知道,我是不可能输给由切换什么QQmlApplicationEngine
来QQuickView
?
换句话说,这两个类之间有什么区别?
我找到的一个区别是(从这里):
与QQuickView不同,QQmlApplicationEngine不会自动创建根窗口.如果您使用Qt Quick中的可视项目,则需要将它们放在窗口内.
这种特殊的差异对我来说无关紧要.
还有其他差异吗?
Component
和Item
QML有什么区别?这里的文档并不完全清楚.用作多个小部件的容器的首选类型是什么?可以替换Rectangle
吗?
例如,以下声明的区别是什么:
Item {
id: itemWidget
Rectangle { id: one }
Rectangle { id: two }
}
Run Code Online (Sandbox Code Playgroud)
和
Component {
id: componentWidget
Rectangle { id: one }
Rectangle { id: two }
}
Run Code Online (Sandbox Code Playgroud)
为什么我们通常Component
在宣布时使用delegate
?
qtquick2 ×10
qml ×9
qt ×8
c++ ×4
qt5 ×4
delegates ×1
linux-mint ×1
qlist ×1
qquickview ×1
qt-creator ×1
qt-quick ×1