我有以下问题:
我将初始界面加载到QQuickView
使用.qml
文件中.然后我要添加QML类型等的Image
或者Text
使用C++的接口.
我知道我可以操纵C++中的现有元素,但是如何创建新类型并添加它们呢?
我是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) 我试图了解如何选择是否使用a QAbstractListModel
或QObject
a QQmlListProperty
.
鉴于QQmlListProperty
处理"角色"功能必须使用QAbstractListModel
它来编写,它似乎是不那么乏味的路线.
我不知道大多数人是否建议使用QAbstractListModel
仅仅因为它已经存在更长时间或者由于某种原因它是更好的选择.
我也没有找到任何关于两种选择之间权衡的讨论.这个问题是在Qt开发者日讨论讨论期间提出的QAbstractListModel
,但答案是"那也行".
我正在尝试使用QML Canvas.requestAnimationFrame
绘制一些自定义动画.我期望为每个帧调用一次提供的回调,大约每秒60次.我的代码是:
Canvas {
id: canvas
width: 600
height: 600
function draw() {
}
Component.onCompleted: {
var i = 1;
function drawFrame() {
requestAnimationFrame(drawFrame)
console.log("Frame callback: " + i++)
draw()
}
drawFrame()
}
onPaint: {
draw()
}
}
Run Code Online (Sandbox Code Playgroud)
我看到的是回调被更频繁地调用.计数器在几秒钟内达到70000,之后应用程序变得完全没有响应.
我究竟做错了什么?
那里有很多QML拖放示例,但它们都没有真正帮助我,因为在所有示例中,您可以将一个元素拖动到另一个元素中,它在哪里居中,而上面拖动的所有其他元素都在它上面.
有没有办法在一侧有一些元素,在另一侧有一个大的Rectangle
地方可以拖入它们,将它们放在它内部的任何地方并且它们保持在它们的确切下落位置?
举例来说,如果我有一个Rectangle
与width: 200; height: 200
我在,这样的元素应该留在我已经放弃了它的位置,例如拖动的元素x: 25
和y: 65
.这应该是元素的位置.
你有什么建议吗?
当窗口宽度太小而无法显示行中的所有项目时,我有一行包含应该堆叠的项目,如下面的草图所示:
该Flow
组件堆的项目,但他们不是中心,但在左侧或右侧对齐:
Flow {
Item {}
Item {}
Item {}
Item {}
Item {}
}
Run Code Online (Sandbox Code Playgroud)
QML中是否有内置方式使流量居中?
好吧,我正在使用以下代码来获取需要存储的文件的文件名.
QString fileName = QFileDialog::getSaveFileName(this, tr("Save File"),"/home/user/MyDocs/",tr("JPG files (*.jpg);;BMP files (*.bmp);;PNG files (*.png)"));
Run Code Online (Sandbox Code Playgroud)
我正在为用户提供有关要保存文件的文件格式的许多选项.但是,返回QString
只给出了用户选择的前缀文件名,而不是后缀,因此我不知道用户选择了哪种文件格式.如何检测这种文件格式?
我希望ApplicationWindow
有一个自动隐藏menuBar
,当鼠标光标位于窗口的最上部时显示.这在QML中是否可行?
PS:我正在使用Qt 5.3.
提前致谢.
我有这样的代码:
ScrollView {
Image {
source: "..."
}
}
Run Code Online (Sandbox Code Playgroud)
Image
高于ScrollView
.如何将后者滚动到中心位置Image
?
我要求我的项目Window
在一个屏幕上显示两个QML (一个发送者,一个接收者).两者都.qml
要求我在里面包含一些Cpp模型,因此我QQmlApplicationEngine
用来注册Cpp模型.
我发现使用QWidget::createWindowContainer()
我能够Window
为一个项目显示多个s.这适用于第一个QML文件.代码片段如下所示:
QQmlApplicationEngine* engine = new QQmlApplicationEngine(Qurl("main.qml"));
QmlContext* context = engine.getContextProperty();
//do some Cpp models registering...
QQuickview *view = new QQuickview(engine,0);
QWidget* container = widget::createWindowContainer(view);
//I realized I dont need to do container->show(); for the main.qml to appear..
//use desktop widget to move the 2nd container to the 2nd screen...
Run Code Online (Sandbox Code Playgroud)
我决定receive.qml
用类似的方法为我创建第二个应用程序引擎.我很快意识到,receive.qml
即使有了,也永远不会打开container2->show()
.现在,它显示一个空页面.
我的问题是:
qml ×8
qt ×8
qtquick2 ×7
qt5 ×3
canvas ×1
listview ×1
qfiledialog ×1
qquickview ×1
qt-quick ×1
qwidget ×1