我有以下问题:
我将初始界面加载到QQuickView使用.qml文件中.然后我要添加QML类型等的Image或者Text使用C++的接口.
我知道我可以操纵C++中的现有元素,但是如何创建新类型并添加它们呢?
我创建了一个基本的QML应用程序,它使用QQuickView创建视图,并在其中有自定义的QQuickItems.我想通过重新实现mousepressevent(QEvent*)方法来处理一个这样的QQuickItem上的鼠标事件.但是,当我运行应用程序并单击QQuickItem时,不会调用 mousepressevent(QEvent*)方法.
QQuickItem的头文件如下所示:
#include <QQuickItem>
#include <QSGGeometry>
#include <QSGFlatColorMaterial>
class TriangularGeometry: public QQuickItem
{
Q_OBJECT
public:
TriangularGeometry(QQuickItem* parent = 0);
QSGNode* updatePaintNode(QSGNode*, UpdatePaintNodeData*);
void mousePressEvent(QMouseEvent *event);
private:
QSGGeometry m_geometry;
QSGFlatColorMaterial m_material;
QColor m_color;
};
Run Code Online (Sandbox Code Playgroud)
注意:我正在使用scenegraph来渲染QuickItem.
这是cpp文件的片段:
void TriangularGeometry::mousePressEvent(QMouseEvent *event)
{
m_color = Qt::black;
update(); //changing an attribute of the qquickitem and updating the scenegraph
}
Run Code Online (Sandbox Code Playgroud)
我可以从应用程序处理鼠标事件,但根据我的要求,我需要通过重写方法mousePressEvent(QMouseEvent*event)来处理它.
我想在一个简单的Qt项目中使用QtQuick Image对象,并在项目中包含图像.我已将图像添加到资源文件中.我使用调试来确保资源存在并作为"Resources/myfile.png"编译到应用程序中
但是,如果我声明一个QtQuick图像对象并将源设置为"Resource/myfile.png",则找不到图像.相反,我收到一条消息:
QML Image: Cannot open: file:///C:/Users/me/Documents/QtCreator/build-myapp-Desktop_Qt_5_1_1_MinGW_32bit-Debug/qml/myapp/Resources/dial_bg.png
Run Code Online (Sandbox Code Playgroud)
如果我尝试使用C++方法来访问文件,也会出现同样的情况
source: ":/Resources/dial_bg.png"
Run Code Online (Sandbox Code Playgroud)
这在编译时遇到错误.
myfile.png尚未复制到该位置.myfile.png没有出现在项目文件中,尽管它已被添加到资源文件中.
我会很满意一个解决方案,要么将图像复制到Image想要拾取它的地方,要么让Image访问'编译版'版本.
我想抓住我的QML应用程序的屏幕.但我的根QML对象是ApplicationWindow,所以我不能QQuickView用来显示它.相反,我必须使用QQmlApplicationEngine.我知道如何使用QQuickView(QQuickWindow::grabWindow)获取屏幕截图,但不知道如何使用它QQmlApplicationEngine.
我的main档案:
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
ApplicationData appData;
QQmlApplicationEngine engine;
engine.load(QUrl("qrc:///main.qml"));
return app.exec();
}
Run Code Online (Sandbox Code Playgroud)
main.qml :
import QtQuick 2.1
import QtQuick.Controls 1.1
import QtQuick.Window 2.1
ApplicationWindow {
id: mainWindow
width: appData.screenWidth
height: appData.screenHeight
visible: true
Rectangle {
id: mainWindowBackground
color: "red"
anchors.fill: parent
}
//...
}
Run Code Online (Sandbox Code Playgroud) 有没有办法使用自定义委托作为ListView类似header和footer属性的每两个连续项之间的分隔符?
我是Qt的新手,所以请耐心等待.
我已成功设法从StringList和Object的QList填充ListView*
我现在正在努力的是使用在C++中定义的派生QAbstractListModel的类在QML中填充ListView.
这是我的CPP类的原型:
class MessageListEntryModel : public QAbstractListModel
{
Q_OBJECT
public:
enum eMLERoleTypes
{
MLERT_MSG = Qt::UserRole+1,
MLERT_COLOR
};
MessageListEntryModel(QObject* parent=0);
virtual ~MessageListEntryModel();
void AddEntry(QString aMessage, QColor aColor);
// pure virtuals implementations
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
int rowCount(const QModelIndex &parent = QModelIndex()) const ;
int columnCount(const QModelIndex &parent = QModelIndex()) const ;
QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const;
QModelIndex parent(const QModelIndex &child) const ;
QHash<int,QByteArray> roleNames();
private:
QList<MessageEntry*> m_vpMessages; …Run Code Online (Sandbox Code Playgroud) 当窗口宽度太小而无法显示行中的所有项目时,我有一行包含应该堆叠的项目,如下面的草图所示:
该Flow组件堆的项目,但他们不是中心,但在左侧或右侧对齐:
Flow {
Item {}
Item {}
Item {}
Item {}
Item {}
}
Run Code Online (Sandbox Code Playgroud)
QML中是否有内置方式使流量居中?
目标是提出一种保护您的QML代码免受抄袭的方法.这是一个问题,因为在这方面,QML的设计和实施方式似乎莫名其妙地不受保护.唯一受到保护的QML类型是完全用C++实现的类型.
总而言之,它几乎看起来Qt故意吝啬QML代码保护,一个明显的候选理由是迫使人们购买具有QML编译器的疯狂表达的商业许可证.
因此,如果没有任何保护QML源的库存方法,目前我想到的唯一解决方案是控制如何解决QML类型.有几种方法可以将类型注册到QML:
但是,我需要的是手动解析QML类型,就像你可以创建一个QQuickImageProvider输入URL字符串并输出图像的自定义一样,我需要QML引擎来请求一个字符串,其类型为我的自定义组件提供程序,它输出一个就绪用于对象实例化组件.
如果使用任何自定义实例化机制,这将很容易,但我需要这些类型在常规QML源中可用.理想情况下,在查看可用的导入路径或甚至是内部注册的类型之前,这应该是用于解析类型的第一种机制.
或者,如果有一种方法可以完全用C++定义QML模块,没有任何外部QML文件,没有qmldir文件等等,那将同样有用.
作为最后的手段,从理想情况来说,我也不愿意在运行时注册QML(而不是C++)类型,这也很有用,但我更愿意完全控制解析过程.
QML插件没有这个技巧,因为它注册了C++类型,我想注册QML类型,即QQmlComponent从字符串源创建并相互引用.
按照这个Qt 教程,我编写了这个简单的代码。有一个水平线,上面ListView有一些简单的彩色矩形作为模型项目的代表。
import QtQuick 2.5
import QtQuick.Window 2.0
import QtQml.Models 2.2
Window {
visible: true
width: 300
height: 120
title: qsTr("Hello World")
Rectangle {
anchors.fill: parent;
ListView{
id: timeline
anchors.fill: parent
orientation: ListView.Horizontal
model: visualModel
delegate: timelineDelegate
moveDisplaced: Transition {
NumberAnimation{
properties: "x,y"
duration: 200
}
}
DelegateModel {
id: visualModel
model: timelineModel
delegate: timelineDelegate
}
Component {
id: timelineDelegate
MouseArea {
id: dragArea
width: 100; height: 100
property bool held: false
drag.target: held ? content …Run Code Online (Sandbox Code Playgroud) 如何将元素居中ColumnLayout?
这是我的qml代码:
ApplicationWindow {
id: root
visible: true
width: 640
height: 640
title: qsTr("Your Booking")
GridLayout{
anchors.fill: parent
columns: 2
flow: GridLayout.TopToBottom
Rectangle{
id: appBar
Layout.columnSpan: 2
width: root.width
height: root.height/10
color: "red"
}
ColumnLayout{
spacing:5
id: columnData
height: root.height - appBar.height
width: root.width/2
ComboBox{
anchors.horizontalCenter: parent.horizontalCenter
}
ComboBox{
}
ComboBox{
}
ComboBox{
}
ComboBox{
}
}
ColumnLayout{
}
}
}
Run Code Online (Sandbox Code Playgroud)
我想在 ColumnLayout 中居中组合框。
qtquick2 ×10
qt ×9
qml ×7
qt5 ×4
c++ ×1
drag ×1
image ×1
listview ×1
mouseevent ×1
screenshot ×1