我正在尝试构建一个内部托管GridView的可重用QML组件.GridView中的每个元素都有一组在整个应用程序中很常见的行为(主要是显示和基于鼠标的东西).但是,GridView元素内显示的内容会根据用例而改变.(也就是说,一个GridView使用相同的封装组件,但在应用程序的其他地方,它可能使用不同的Component.)
所以,我想要做的是让每个调用提供一个委托,该委托被添加到GridView中的每个元素,该元素已经是委托.换句话说,这样的事情:
MyGrid.qml
import QtQuick 1.1
Rectangle {
id: myGrid
objectName: "myGrid"
property Component internalDelegate
property variant internalModel
GridView {
anchors.fill: parent
delegate: Row {
Loader {
sourceComponent: myGrid.internalDelegate
}
}
model: parent.internalModel
}
}
Run Code Online (Sandbox Code Playgroud)
我们的想法是GridView委托中的Loader加载用户提供的委托,它看起来像这样:
Main.qml
import QtQuick 1.1
Rectangle {
anchors.fill: parent
width: 300
height: 200
MyGrid {
anchors.fill: parent
internalDelegate: Text {
text: name
}
internalModel: ListModel {
ListElement {
name: "a"
}
ListElement {
name: "b"
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是,这不起作用.QML报告"name"是Text元素中的未知变量.如果我用字符串替换name变量(即"hello"),它会按预期工作.
我的问题是,如何将"name"变量传递给internalDelegate,或者更好的是,使整个模型可用,以便internalDelegate可以访问所有这些变量(因为调用者也在定义模型).
一个侧面问题是:有更好的方法吗?
QML是在编译时翻译成本机代码还是在运行时解释几乎与在Web浏览器中运行JavaScript的方式相同?
你能告诉我下面的代码有没有办法改变imgx元素属性.我必须使用javascript更改imgx.x值.或者还有其他方法吗?我搜索qt docs但没有帮助.谢谢.
Row {
Repeater {
id:mmm
model : 10
Rectangle{
clip: true
width: 54
height: 80
color:"transparent"
Image {
id:imgx
//x:-160
//x:-105
//x:-50
x:0
source: "images/tarama_lights.png"
}
}
}
}
Run Code Online (Sandbox Code Playgroud) 我首先要提到的是,以下工作正常到Qt 5.0.0 beta 1(也许是beta 2和RC也不知道),但在Qt 5.0.0最终版本中失败了.我只想参考Qt 5.0.0最终版本中看到的结果.所以很可能这与Qt5最近的变化有关.
在C++方面,我在命名空间中有一组类(QObject派生)(可选地用编译器标志触发;类在一个单独的库中,并且库将命名空间的使用作为选项留给用户使用图书馆).这里的一个类Game可能看起来像这样(摘录):
OAE_BEGIN_NAMESPACE
// forward-declarations:
class Player; // Player is just another class in the same library
class Game : public QObject
{
Q_OBJECT
public:
explicit Game(...);
public slots:
Player *player() const; // <-- the quesion is about such slots
};
OAE_END_NAMESPACE
Run Code Online (Sandbox Code Playgroud)
这些宏OAE_BEGIN/END_NAMESPACE扩展为namespace OAE_NAMESPACE {...... }或者没有,就像Qt所做的那样<qglobal.h>,只是在宏名称中用"OAE"替换"QT":
#ifndef OAE_NAMESPACE
# define OAE_PREPEND_NAMESPACE(name) ::name
# define OAE_USE_NAMESPACE
# define OAE_BEGIN_NAMESPACE
# define OAE_END_NAMESPACE
# define OAE_BEGIN_INCLUDE_NAMESPACE
# …Run Code Online (Sandbox Code Playgroud) 我正在进行QtQuick 2.0演示,我想嵌入一些代码示例.是否可以轻松创建突出显示qml元素的语法.
您能否举例说明如何实现它的示例技术和想法.
谢谢
我想像这样运行js函数
function setPersonalInfoValue(){
console.debug("setPersonalInfoValue()");
}
Run Code Online (Sandbox Code Playgroud)
当页面加载QML时.
我试过这个:
Rectangle {
id: page2
width: 100
height: 62
function setPersonalInfoValue(){
console.debug("setPersonalInfoValue()");
}
}
Run Code Online (Sandbox Code Playgroud)
我想在第1页到第2页之间切换时运行setPersonalInfoValue()函数.我该怎么做?
我要疯了.我在ScrollView中有一个ListView,连接到一个继承QAbstractListModel的模型.将对象添加到模型时,ListView使用委托显示它们.到现在为止还挺好.
但我真的希望视图保持滚动到底部(就像聊天窗口一样),而且我很难实现这一点.这是相关的QML代码:
Rectangle {
ScrollView {
[anchor stuff]
ListView {
id: messageList
model: textMessageFiltered
delegate: messageDelegate
}
}
TextField {
id: messageEditor
[anchor stuff]
onAccepted: {
controller.sendTextMessage(text)
text = ""
/* This works. */
//messageList.positionViewAtEnd();
}
}
Component {
id: messageDelegate
Rectangle {
anchors.left: parent.left
anchors.right: parent.right
color: "white"
height: nameText.height + 4
Text {
id: nameText
wrapMode: Text.Wrap
text: "<b>" + authorName + " (" + authorId + ")</b> " + message
[anchor stuff]
}
ListView.onAdd: {
console.log("This prints …Run Code Online (Sandbox Code Playgroud) 这看起来非常基本,但出于某种原因,我无法在下面的超简单QML应用程序中使用图像源.
仅供参考,我正在运行基于Qt 5.3.2的Mac OS-X 10.9.5,Qt Creator 3.2.1.
import QtQuick 2.3
import QtQuick.Controls 1.2
ApplicationWindow {
visible: true
width: 640
height: 480
title: qsTr("Test")
Image {
id: image1
x: 10
y: 10
width: 100
height: 100
source: "testImage.png"
}
}
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
qrc:/main.qml:10:5: QML Image: Cannot open: qrc:/testImage.png
Run Code Online (Sandbox Code Playgroud)
已创建应用程序窗口但未显示任何图像.我也试过在Rectangle中包装图像,但这没有用.
我在这做错了什么?
"testImage.png"位于项目目录中,我尝试了各种方法来使用资源指定图像路径,绝对,相对,甚至使用QML UI设计器手动指定图像源.
我还要提到为了让Qt 5.3.2工作,我遵循了HERE建议的修改.
谢谢.
据我所知,.qml文件可用于定义UI,它似乎覆盖了ui.qml文件中的任何内容.那么,ui.qml文件的用途究竟是什么?
我正在使用Qt5和Qt Creator.