Qt model.rowCount()赢得';t绑定到项目';s属性 我有一个代码,> ListVIEW/COD>,它是用一个自定义的C++模型初始化的,名为“代码> RooMead < /代码> Qml内部。 该模型继承QAbstractListModel,并将QVector定义为用于填充模型的私有成员
在我的Qt model.rowCount()赢得';t绑定到项目';s属性 我有一个代码,> ListVIEW/COD>,它是用一个自定义的C++模型初始化的,名为“代码> RooMead < /代码> Qml内部。 该模型继承QAbstractListModel,并将QVector定义为用于填充模型的私有成员,qt,qml,scrollview,qtquickcontrols2,Qt,Qml,Scrollview,Qtquickcontrols2,在我的应用程序窗口中我创建了一个对话框,在该对话框中我更改了模型并调用setList()函数对其进行更新。这个很好用 我还想将模型的大小连接到ScrollView的int属性。此属性将定义行布局的子项 问题是,当我试图将此属性绑定到模型的大小时,应用程序崩溃 仅供参考,模型的所有修改均遵循Qt的规则rowCount()是Q\u可调用的。我也尝试过使用onModelChanged处理程序,但这不起作用(我在文档中检查过,当发出modelReset()时会发出此信号,这是在setList()内部通过
应用程序窗口中
我创建了一个对话框
,在该对话框中我更改了模型并调用setList()
函数对其进行更新。这个很好用
我还想将模型的大小连接到ScrollView
的int
属性。此属性将定义行布局的子项
问题是,当我试图将此属性绑定到模型的大小时,应用程序崩溃
仅供参考,模型的所有修改均遵循Qt的规则rowCount()
是Q\u可调用的
。我也尝试过使用onModelChanged
处理程序,但这不起作用(我在文档中检查过,当发出modelReset()
时会发出此信号,这是在setList()
内部通过endResetModel()
我相信这是一个简单的过程(在我的项目中已经执行了很多次属性绑定),但没有按预期工作
我引用了我的项目的一些示例代码
//main.qml
ConfiguredChannels{
id: configuredList
anchors{
left: parent.left
top: devices.bottom
right: tabs.left
bottom: parent.bottom
}
}
TabArea {
id: tabs
y: toolBar.height
x: parent.width / 8
anchors {
top: toolBar.bottom
}
width: 3 * parent.width / 4
height: 3 * parent.height / 4
countPWM: configuredList.model.rowCount() //This is where I want to bind.
}
//ConfiguredChannels.qml
id: confChanView
header: confChanHeader
model: ChannelModel{
id: rootModel
list: channelList
}
//TabArea.qml
Item{
id: tabAreaRoot
property alias channelsPWM: channelsPWM
property int countPWM
ScrollView{
id: scrollPWM
anchors.fill: parent
contentItem: channelsPWM.children
horizontalScrollBarPolicy: Qt.ScrollBarAlwaysOn
RowLayout{
id: channelsPWM
spacing: 0
Layout.fillHeight: true
Layout.fillWidth: true
Component.onCompleted: {
var namesPWM = [];
for (var i=0; i<countPWM; i++){
namesPWM.push("Channel"+(i+1));
}
createChannels(countPWM, "PWM", channelsPWM, namesPWM);
}
}
}
[编辑2]
尽管EDIT 1中的解决方案可以工作,并为我的ScrollView
生成正确的子对象,但我认为这还不够好,我认为最好的实现是通过调用createStrips(countPWM)
函数来绑定模型的大小更改。例如:
\\main.qml
ConfiguredChannels{
id: configuredList
anchors{
left: parent.left
top: devices.bottom
right: tabs.left
bottom: parent.bottom
}
onModelChanged: tabs.createStrips(model.rowCount) //or an appropriate signal handler defined on C++ side
}
也许更好的是,创建子对象
作为一个自定义的qml
信号处理程序,每次更改模型的大小时都会发出该处理程序。(我像上面一样尝试了onModelChanged
,但不起作用。在这种情况下,可能会丢失该信号)
[解决方案]
我遵循了被接受的答案的指示以及这个
我在名为rowCount
的头文件中,使用NOTIFY
rowCountChanged
以及信号void rowCountChanged();
向模型的定义添加了Q_属性
我用它来更新模型,我在它的实现结束时添加了emit rowCountChanged();
。最后我用我的函数createStrips(count)连接了这个信号
在QML内部。现在,每次更改模型的大小时,myScrollView
将自动更新显示为行布局的子项的条带
\\ChannelModel.h
...
Q_PROPERTY(int rowCount READ rowCount NOTIFY rowCountChanged)
...
signals:
void rowCountChanged();
\\ChannelModel.cpp
void ChannelModel::setList(ChannelList *list)
{
beginResetModel();
...
endRestModel();
emit rowCountChanged();
}
\\main.qml
Connections {
target: configuredList.model
onRowCountChanged: tabs.createStrips(configuredList.model.rowCount)
}
无法绑定到可调用的Q_
,因为与更改信号没有关联
创建Q\u属性(count READ rowCount NOTIFY rowCountChanged)
或类似内容。确保插入或删除行时发出信号rowCountChanged
当然,如果你有一个
Q_PROPERTY(count READ count NOTIFY countChanged)
int count() { return rowCount(); }
并确保发出countChanged
然后您可以绑定到属性count
只有q属性允许绑定,在您的情况下q\u可调用
不是,因此您必须创建它,为此,我们使用信号rowsInserted
和rowsRemoved
,如下所示:
*.h
Q_PROPERTY(int rowCount READ rowCount NOTIFY rowCountChanged)
public:
...
signals:
void rowCountChanged();
*.cpp
//constructor
connect(this, &QAbstractListModel::rowsInserted, this, &YourModel::rowCountChanged);
connect(this, &QAbstractListModel::rowsRemoved, this, &YourModel::rowCountChanged);
*.qml
countPWM: configuredList.model.rowCount // without ()
注:
我假设在添加或删除元素时,您使用的是:
beginInsertRows(QModelIndex(), rowCount(), rowCount());
//append data
endInsertRows();
或:
您是否尝试使用调试器查找导致崩溃的错误?应用程序崩溃的行是什么?错误消息是什么?请提供所有相关代码,包括模型。哎呀,我忽略了问题中的崩溃部分。请提供您的模型的最小示例,您可以在其中调用rowCount()
,如果这是导致应用程序崩溃的原因。绑定到Q\u INVOKABLE
s不是真正的绑定,因为没有更改通知。我听从了你的建议,但应用程序仍然崩溃。在setList()
内部,我确实使用了你提到的信号,前面是beginResetModel()
,后面是endResetModel())
。我试图将它们与rowCountChanged
连接,但它们受到保护。@K.Tsakalis这不是你有一个选择,这是必须做的,Qt同意,beginXXX和endXXX立即通知,它们不是信号,而是函数。另一方面,rowCountChanged是我创建的一个信号,它不是一个方法。@K.Tsakalis rowsInserted和rowsRemoved是信号@K.Tsakalis要了解beginXXX和endXXX的用法,请检查以下内容:,我强调beginXXX和endXXX是mandatory@K.Tsakalis您的应用程序可能因错误的实现而崩溃,因此,如果您不提供帮助,则不可能实现。
beginInsertRows(QModelIndex(), rowCount(), rowCount());
//append data
endInsertRows();
beginRemoveRows(QModelIndex(), from, to)
// remove
endRemoveRows();